如何获取Panel容器内TextBox控件的输入值
动态创建TextBox按从左到右顺序读取输入值的实现方案
核心原因:Panel的控件集合默认按照控件创建顺序或Z轴层级存储,不会自动匹配视觉上的从左到右排列顺序,需手动排序后再取值。
WinForm 场景实现方案
方案1:按控件水平位置排序(无需修改创建逻辑)
直接根据TextBox的Left属性(控件左上角距离Panel左边缘的水平坐标)升序排序,即可得到从左到右的顺序:
// 筛选Panel内所有TextBox控件并按水平位置排序 var sortedTextBoxes = panel1.Controls.OfType<TextBox>() .OrderBy(textBox => textBox.Left) .ToList(); // 按顺序读取数值 List<int> resultValues = new List<int>(); foreach (var textBox in sortedTextBoxes) { if (int.TryParse(textBox.Text, out int value)) { resultValues.Add(value); } }
如果存在多行TextBox,需要先从上到下、再从左到右取值,可以增加垂直位置排序规则:
var sortedTextBoxes = panel1.Controls.OfType<TextBox>() .OrderBy(textBox => textBox.Top) // 先按垂直位置排序,保证从上到下 .ThenBy(textBox => textBox.Left) // 同垂直位置再按水平位置排序,保证从左到右 .ToList();
方案2:创建控件时标记顺序(性能更高)
如果创建控件的逻辑可修改,可以在创建时给Tag属性赋值顺序标记,后续直接按标记排序即可:
// 创建控件时标记顺序 for (int i = 0; i < 需要创建的TextBox数量; i++) { TextBox newTextBox = new TextBox(); newTextBox.Tag = i; // 按从左到右的创建顺序赋值标记 // 其余控件位置、样式赋值逻辑 panel1.Controls.Add(newTextBox); } // 取值时按标记排序 var sortedTextBoxes = panel1.Controls.OfType<TextBox>() .OrderBy(textBox => (int)textBox.Tag) .ToList();
WPF 场景实现方案
WPF中需先获取控件相对于Panel的水平坐标再排序:
var sortedTextBoxes = panel1.Children.OfType<TextBox>() .OrderBy(textBox => textBox.TransformToAncestor(panel1) .Transform(new Point(0,0)).X) .ToList();
内容的提问来源于stack exchange,提问作者fatihkadiryilmaz
相关产品推荐
相关产品推荐

