关联/关联两个数字上下按钮
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
我正在尝试在 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