关联/关联两个数字上下按钮

Associate / Relate two numericupdown buttons

我正在尝试在 VB .NET 中创建一个程序,其中应关联两个 numericupdown 按钮,如果更改了 samp 按钮中的值,也应控制最大值,反之亦然。我已经为它编写了代码,但不知何故它不能完美运行。请让我在这里缺少什么。

samp 最小值设置为 50,最大值 400;尽管 max 最小值设置为 0,最大值 350

Private Sub samp_changed() Handles config_samp.ValueChanged

If config_samp.Value <= 400 And config_samp.Value >= 299 Then
   config_max.Value = 150
End If

If config_samp.Value <= 300 And config_samp.Value >= 199 Then
   config_max.Value = 250
End If

If config_samp.Value <= 198 And config_samp.Value >= 50 Then
   config_max.Value = 350
End If

End Sub


Private Sub max_changed() Handles config_max.ValueChanged

If config_max.Value <= 350 And config_max.Value >= 251 Then
   config_samp.Value = 200
End If

If config_max.Value <= 250 And config_max.Value >= 151 Then
   config_samp.Value = 300
End If

If config_max.Value <= 150 And config_max.Value >= 101 Then
   config_samp.Value = 400
End If

End Sub

当程序执行samp_changed()时,config_max的.Value被改变了,所以它调用max_changed(),这可能会改变config_samp的值,这将意味着 samp_changed() 被调用,它最终被锁定为一个值。

您需要做的是暂时阻止每个方法调用另一个方法。您可以通过显式删除处理程序、更改值和添加处理程序来实现。

那些If config_max.Value <= 350 And config_max.Value >= 251 Then,等等,线条有点笨重。使用 Case 语句可以更容易地看到发生了什么,如下所示:

Public Class Form1

    Private Sub samp_changed(sender As Object, e As EventArgs)
        Dim newMaxValue = 0
        Dim valueChanged = False

        Select Case config_samp.Value
            Case 50 To 198
                newMaxValue = 350
                valueChanged = True
            Case 199 To 300
                newMaxValue = 250
                valueChanged = True
            Case 299 To 400
                newMaxValue = 150
                valueChanged = True
        End Select

        If valueChanged Then
            RemoveHandler config_max.ValueChanged, AddressOf max_changed
            config_max.Value = newMaxValue
            AddHandler config_max.ValueChanged, AddressOf max_changed
        End If

    End Sub


    Private Sub max_changed(sender As Object, e As EventArgs)
        Dim newSampValue = 0
        Dim valueChanged = False

        Select Case config_max.Value
            Case 101 To 150
                newSampValue = 400
                valueChanged = True
            Case 151 To 250
                newSampValue = 300
                valueChanged = True
            Case 251 To 350
                newSampValue = 200
                valueChanged = True
        End Select

        If valueChanged Then
            RemoveHandler config_samp.ValueChanged, AddressOf samp_changed
            config_samp.Value = newSampValue
            AddHandler config_samp.ValueChanged, AddressOf samp_changed
        End If

    End Sub

    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        AddHandler config_samp.ValueChanged, AddressOf samp_changed
        AddHandler config_max.ValueChanged, AddressOf max_changed

    End Sub

End Class