C# 如何将字符串转换为对应控件对象并进行操作
正确实现方案
C# 中无法直接将字符串拼接的名称转为控件实例,字符串只是标识控件名的文本,不是控件本身的引用,必须通过父容器的控件集合按Name检索,或者预先绑定控件实例统一遍历,两种方案都能完全替代你原来冗余的逐次判断逻辑。
方案1:按控件名称动态查找(适合控件已在设计器中手动添加的场景)
直接适配你写的伪代码逻辑,注意控件名大小写匹配、序号对应关系:
public void func2(){ for (int sum = 0; sum < 25; sum++){ // 按Name查找控件,第二个参数true表示递归搜索所有子容器(比如Panel、GroupBox里的控件也能找到) Control[] matched = this.Controls.Find($"textBox{sum}", true); // 校验找到的控件是TextBox类型,避免同名其他控件引发类型转换错误 if (matched.Length > 0 && matched[0] is TextBox tb){ tb.Left = sum * 5; } } }
注意事项
- 拼接的控件名必须和设计器里TextBox的
Name属性完全一致,包括大小写:比如你原有控件命名是textBox1(驼峰格式),不能拼成textbox1(全小写t)。 - 如果你的文本框是从
textBox1开始命名(没有textBox0),把拼接逻辑改成$"textBox{sum + 1}"即可适配序号偏移。 - 注:如果使用低于C# 7.0的版本,把类型判断逻辑替换为
as转换即可:if (matched.Length > 0) { TextBox tb = matched[0] as TextBox; if (tb != null) { tb.Left = sum * 5; } }
方案2:预先定义控件数组(性能更高,更稳定)
避免每次循环都遍历控件集合查找,也不会因为误改设计器里的控件名称导致找不到控件,适合控件数量固定的场景:
// 窗体类级别定义数组,一次性绑定所有要操作的TextBox private TextBox[] _targetTextBoxes; public Form1(){ InitializeComponent(); // 在窗体初始化时把所有TextBox按顺序存入数组,省略号处补全所有控件即可 _targetTextBoxes = new TextBox[] { textBox0, textBox1, textBox2, /* ... 一直到textBox24 */ }; } public void func2(){ for (int sum = 0; sum < _targetTextBoxes.Length; sum++){ // 判空避免未赋值的控件引发空引用异常 if (_targetTextBoxes[sum] != null){ _targetTextBoxes[sum].Left = sum * 5; } } }
方案2优势
- 不需要依赖字符串匹配控件名,就算后续修改控件的Name属性也不会影响逻辑运行
- 避免每次循环遍历控件集合,性能更高,适合控件数量较多的场景
内容的提问来源于stack exchange,提问作者Cicker
相关产品推荐
相关产品推荐

