Vb.net 按taborder遍历控件

Vb.net 按taborder遍历控件,vb.net,Vb.net,今天,我请求帮助循环检查表单上的所有控件,以便参考NumericUpDown,这是一个公认的答案: Dim errors As String = "" For Each ctrl As Control In Me.Controls Dim num = TryCast(ctrl, NumericUpDown) If num IsNot Nothing AndAlso (num.Value < 1 OrElse num.Value > 50) Then

今天,我请求帮助循环检查表单上的所有控件,以便参考NumericUpDown,这是一个公认的答案:

Dim errors As String = ""
For Each ctrl As Control In Me.Controls
    Dim num = TryCast(ctrl, NumericUpDown)
    If num IsNot Nothing AndAlso (num.Value < 1 OrElse num.Value > 50) Then
         errors += ctrl.Name + " is out of range." + Environment.NewLine
    End If
Next
Dim错误为String=“”
对于Me.Controls中的每个ctrl-As控件
Dim num=TryCast(ctrl,NumericUpDown)
如果num不是空且也是空(num.Value<1或lse num.Value>50),则
错误+=ctrl.Name+“超出范围。“+Environment.NewLine”
如果结束
下一个
后来,通过开发我的程序,我意识到NumericUpDown是以(对我来说)未知的顺序列出的,这不是想要的结果。
我希望/需要通过选项卡顺序的索引循环NumericUpDown


请注意,linq不可用,因为此应用程序是针对.NET framework 2.0的。

假设在设计器中定义了三个NumericUpDown控件,并命名为
numericUpDown1、numericUpDown2、numericUpDown3
现在在form类中声明一个全局变量

Public Class MyForm

    Dim numUpDnList(2) As NumericUpDown
    ....
然后在代码中(可能是在form load事件中),按照所需的顺序将它们添加到数组变量中

Protected Sub MyForm_Load(sender as Object, e as EventArgs) Handles Form.Load

      numUpDnList(0) = numericUpDown1
      numUpDnList(1) = numericUpDown3
      numUpDnList(2) = numericUpDown2

End Sub
此时,无论何时需要枚举这些控件,代码都非常简单

Dim errors As String = ""
For Each num In numUpDnList
    If (num.Value < 1 OrElse num.Value > 50) Then
         errors += num.Name + " is out of range." + Environment.NewLine
    End If
Next
Dim错误为String=“”
对于numUpDnList中的每个num
如果(数值<1或数值>50),则
错误+=num.Name+“超出范围。“+Environment.NewLine”
如果结束
下一个
还有另一种方法可以使用TabOrder后面的方法循环控件集合

Dim errors as String
Dim ctrl = Me.GetNextControl(f, true)
while ctrl IsNot Nothing
    Dim num = TryCast(ctrl, NumericUpDown)
    If num IsNot Nothing AndAlso (num.Value < 1 OrElse num.Value > 50) Then
        errors += ctrl.Name + " is out of range." + Environment.NewLine
     End If        
     ctrl = f.GetNextControl(ctrl, true)
End While
Dim错误作为字符串
Dim ctrl=Me.GetNextControl(f,true)
而ctrl也不是什么
Dim num=TryCast(ctrl,NumericUpDown)
如果num不是空且也是空(num.Value<1或lse num.Value>50),则
错误+=ctrl.Name+“超出范围。“+Environment.NewLine”
如果结束
ctrl=f.GetNextControl(ctrl,true)
结束时

这些控件是动态创建的吗?或者您是否通过表单设计器进行了设计?在后一种情况下,您可以准备一个控件数组,并将它们按您喜欢的顺序排列,这样可以极大地简化循环。控件是通过设计器创建的,而不是通过友好方式创建的。你能给我一个这样做的代码吗?史蒂夫,我会等一段时间,以便得到更通用的解决方案。这不是一种迫使“for each”按某种可预测的顺序循环的方法吗?按Control.TabIndex,甚至按Control.Name?不客气,如果您不能使用Linq,您将被迫使用自己的规则对控件进行排序。请参阅中的自定义IComparer类的实现,但这似乎比本例实际需要的麻烦更多。如果没有创建更通用的逻辑的具体要求,我总是喜欢使用简单易懂的解决方案。感谢您帮助Steve,但我不敢相信这里没有像VB6那样简单易懂的解决方案。例如,如果命令SelectNextControl“知道”选项卡索引中的下一个(或上一个)控件,则此处“应该”是通过该命令直接循环控件而无需工作区的方法。如果我没有找到解决方案,那么我将使用您的建议来处理NUD-s数组。您提醒我,有一个名为的方法可能会有所帮助,但您对返回的控件没有太多的“控制”,只会遵循TabOrder,并且在TabOrder中一般查找第一个控件仍然存在问题OK Steve,我明白了,我会接受你的第一个答案。我让它工作。然后我将看到其他选项,这个带有GetNextControl的选项听起来也很有趣。谢谢