VB.NET中For Each遍历MyPanel控件为何顺序异常?
WinForms控件遍历顺序问题:原因与解决办法
问题原因
WinForms容器的Controls集合默认遍历顺序不是界面视觉上的从左到右,而是控件被添加到容器的先后顺序。你遇到的反向遍历情况,说明添加这些文本框时,是先放入txtCombinacion14,再依次添加13到1,或者是按反向顺序完成的控件添加操作。
解决办法
方法1:按控件左边缘位置排序
通过控件的Left属性(距离容器左边界的像素值)排序,实现视觉上的从左到右遍历:
' 初始化随机数实例(放在循环外避免重复) Dim rnd As New Random() ' 筛选目标文本框并按Left属性升序排序 Dim sortedTextBoxes = From txt In MyPanel.Controls.OfType(Of TextBox)() Where txt.Name.StartsWith("txtCombinacion") Order By txt.Left Ascending ' 遍历赋值 For Each txt In sortedTextBoxes txt.Text = rnd.Next(1, 100).ToString() ' 可根据需求调整随机数范围 Next
方法2:按控件名称中的数字排序
利用你命名的规律性(名称带数字后缀),提取数字后排序:
Dim rnd As New Random() ' 提取名称中的数字并按数字升序排序 Dim sortedTextBoxes = From txt In MyPanel.Controls.OfType(Of TextBox)() Where txt.Name.StartsWith("txtCombinacion") Let num = Integer.Parse(txt.Name.Replace("txtCombinacion", "")) Order By num Ascending For Each txt In sortedTextBoxes txt.Text = rnd.Next(1, 100).ToString() Next
注意事项
不要在循环内部重复创建Random实例,否则循环执行过快时,会因系统时钟精度问题生成大量重复的随机数。
内容的提问来源于stack exchange,提问作者UtenteOtto
相关产品推荐
相关产品推荐

