如何将按sXvY规则命名的TextBox控件便捷存入二维数组
简化实现方案
以下两种方案均可以替代手动逐个声明的写法,大幅减少冗余代码:
方案1:控件容器查找(适用于WinForm/ASP.NET Web Forms)
直接通过控件名称在当前窗体的控件集合中递归查找,不需要依赖反射,性能更高:
// 定义12行7列的二维数组 TextBox[,] girdiler = new TextBox[12, 7]; for (int s = 1; s <= 12; s++) { for (int v = 1; v <= 7; v++) { string ctrlName = $"s{s}v{v}"; // 第二个参数为true表示递归查找所有子容器内的控件,适配TextBox放在Panel、GroupBox等容器的场景 girdiler[s - 1, v - 1] = Controls.Find(ctrlName, true).FirstOrDefault() as TextBox; } }
方案2:反射查找(全平台通用,WinForm/WPF均适用)
直接读取当前类的成员字段获取控件实例,不受控件所在父容器层级限制:
using System.Reflection; TextBox[,] girdiler = new TextBox[12, 7]; Type currentType = this.GetType(); for (int s = 1; s <= 12; s++) { for (int v = 1; v <= 7; v++) { string ctrlName = $"s{s}v{v}"; FieldInfo field = currentType.GetField(ctrlName, BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic); girdiler[s - 1, v - 1] = field?.GetValue(this) as TextBox; } }
注意事项
- 数组默认下标从0开始,
s1v1对应girdiler[0,0],s12v7对应girdiler[11,6],如果需要1开头的下标可以调整数组初始化长度和赋值时的索引计算逻辑 - 初始化完成后可增加空值校验,避免控件名拼写错误、控件未生成导致的后续空引用异常
- 代码仅需要执行一次,可放在窗体构造函数、Loaded/Load事件中运行
内容的提问来源于stack exchange,提问作者ZEYN
相关产品推荐
相关产品推荐

