【发布时间】:2016-02-29 16:49:13
【问题描述】:
可能很容易,但我不知道如何实现这一目标。我的表单上有 3 个数字控件。那里的值可能是1,2 or 3。假设这三个值中的每一个都只能在其中一个控件中出现一次。所以假设我有
IntInputVariation1.value = 1
IntInputVariation2.value = 2
IntInputVariation3.value = 3
现在,如果有人将其中一个值更改为 IntInputVariation2.value 到 3,那么 IntInputVariation3.value 必须为 2。
希望你明白我的意思。
当表单正在加载时,所有控件都从 1 设置为 3,如下所示:
IntInputVariation1.value = 1
IntInputVariation2.value = 2
IntInputVariation3.value = 3
此时用户可以更改它...
到目前为止,我这样做了,但仍然有问题..你能帮忙吗?
我试图像这样保存我的控件的第一个状态:
Private Class VariationPositionValues
Public Shared First As String = "IntInputVariation1"
Public Shared Second As String = "IntInputVariation2"
Public Shared Third As String = "IntInputVariation3"
End Class
然后下面的处理程序方法我关联到所有那些控制 ValueChanged 事件:
Private Sub IntInputVariation_ValueChanged(sender As Object, e As EventArgs)
Dim inputNumbControl As DevComponents.Editors.IntegerInput = CType(sender, DevComponents.Editors.IntegerInput)
Dim NewValue As Integer = inputNumbControl.Value
Select Case inputNumbControl.Name
Case "IntInputVariation1"
If IntInputVariation2.Value = NewValue Then
IntInputVariation2.Value = 1
VariationPositionValues.IntInputVariation1 = IntInputVariation1.Value
VariationPositionValues.IntInputVariation2 = IntInputVariation2.Value
End If
If IntInputVariation3.Value = NewValue Then
IntInputVariation3.Value = VariationPositionValues.IntInputVariation1
VariationPositionValues.IntInputVariation1 = IntInputVariation1.Value
VariationPositionValues.IntInputVariation3 = IntInputVariation3.Value
End If
Case "IntInputVariation2"
If IntInputVariation1.Value = NewValue Then
IntInputVariation1.Value = VariationPositionValues.IntInputVariation2
VariationPositionValues.IntInputVariation2 = IntInputVariation2.Value
VariationPositionValues.IntInputVariation1 = IntInputVariation1.Value
End If
If IntInputVariation3.Value = NewValue Then
IntInputVariation3.Value = VariationPositionValues.IntInputVariation2
VariationPositionValues.IntInputVariation2 = IntInputVariation2.Value
VariationPositionValues.IntInputVariation3 = IntInputVariation3.Value
End If
Case "IntInputVariation3"
If IntInputVariation1.Value = NewValue Then
IntInputVariation1.Value = VariationPositionValues.IntInputVariation3
VariationPositionValues.IntInputVariation3 = IntInputVariation3.Value
VariationPositionValues.IntInputVariation1 = IntInputVariation1.Value
End If
If IntInputVariation2.Value = NewValue Then
IntInputVariation2.Value = VariationPositionValues.IntInputVariation3
VariationPositionValues.IntInputVariation3 = IntInputVariation3.Value
VariationPositionValues.IntInputVariation2 = IntInputVariation2.Value
End If
End Select
End Sub
进一步讨论:
Select Case variationCount
Case 1
nums = Enumerable.Range(1, 1).ToArray
nuds = {IntInputVariation1}
Case 2
nums = Enumerable.Range(1, 2).ToArray
nuds = {IntInputVariation1, IntInputVariation2}
Case 3
nums = Enumerable.Range(1, 3).ToArray
nuds = {IntInputVariation1, IntInputVariation2, IntInputVariation3}
End Select
ignore = False
那么当代码在第二次尝试访问事件时:
If ignore Then Exit Sub
然后得到这个错误:System.IndexOutOfRangeException
Plutonix 检查的有效解决方案:
在表单加载时得到这个:
variationCount = BusinessLayer.SubKategorie_Variation.GetVariationCountBySubKategorie(AdvTreeSubKategories.SelectedValue)
Select Case variationCount
Case 1
IntInputVariation1.MaxValue = 1
nums = Enumerable.Range(1, 1).ToArray
nuds = {IntInputVariation1}
Case 2
IntInputVariation1.MaxValue = 2
IntInputVariation2.MaxValue = 2
nums = Enumerable.Range(1, 2).ToArray
nuds = {IntInputVariation1, IntInputVariation2}
Case 3
IntInputVariation1.MaxValue = 3
IntInputVariation2.MaxValue = 3
IntInputVariation3.MaxValue = 3
nums = Enumerable.Range(1, 3).ToArray
nuds = {IntInputVariation1, IntInputVariation2, IntInputVariation3}
End Select
ignore = False
后来我得到了这个:
If ignore Then Exit Sub
' dont do this while doing this ;)
ignore = True
'--Whho called
Dim nud = CType(sender, DevComponents.Editors.IntegerInput)
'--Other ctls, vals, remove the one the user changed
Dim otherVals = nums.Except(New Int32() {nud.Value}).ToArray
Dim others = nuds.Except(New DevComponents.Editors.IntegerInput() {nud}).ToArray
' set the first
others(0).Value = otherVals(0)
otherVals = otherVals.Except(New Int32() {others(0).Value}).ToArray
If variationCount > 2 Then others(1).Value = otherVals(0)
ignore = False
【问题讨论】:
-
真的只有3个值吗?
-
是的,我认为到目前为止我找不到非常简单的方法。这 3 个数字中的一个数字只能在其中一个控件中出现一次。如果我可以在 ValueChanged 事件中获得旧值但没有,会更容易。
-
在我的脑海中,你想在改变之前获取改变的值(也许是 focus() 事件?)并保存它,然后在改变时,通过其他两个并找到等于新值的那个,并将其更改为已更改值的先前值。我想这样就可以了。