C#中如何为动态创建的TextBox设置值?空引用异常排查
问题原因及解决方法
核心错误:控件命名拼接逻辑错误
你的代码在动态创建TextBox时,命名拼接的顺序导致实际生成的控件名称和预期不一致:
txtValue.Name = "txt_numberSabad" + i+1;
C#中字符串拼接是左结合运算,这段代码会先执行"txt_numberSabad" + i得到字符串,再拼接1。比如i=2时,生成的名称是txt_numberSabad21,而非你想要的txt_numberSabad3。这直接导致后续查找控件时返回null,触发NullReferenceException。
解决步骤
1. 修正控件命名逻辑
给i+1加上括号,确保先计算数值再拼接字符串:
txtValue.Name = "txt_numberSabad" + (i + 1);
这样当i从0到4(countRow=5)时,生成的TextBox名称依次是txt_numberSabad1到txt_numberSabad5,和后续查找的命名规则完全匹配。
2. 优化查找逻辑(可选)
如果后续遇到控件嵌套的复杂场景,可使用递归方法确保找到目标控件,同时添加空判断避免异常:
private Control FindControlByName(Control parent, string name) { if (parent.Name == name) return parent; foreach (Control ctrl in parent.Controls) { Control found = FindControlByName(ctrl, name); if (found != null) return found; } return null; }
使用方式:
TextBox txt = (TextBox)FindControlByName(tableLayout, "txt_numberSabad3"); if (txt != null) { txt.Text = "new text for texBox"; }
3. 完整修正后的代码示例
动态创建控件的方法:
public void DynamicObjects(int countRow) { tableLayout.RowCount = countRow; tableLayout.ColumnCount = 2; for (int i = 0; i < countRow; i++) { Label lblTitle = new Label(); lblTitle.Text = i + "box"; lblTitle.TextAlign = ContentAlignment.MiddleCenter; tableLayout.Controls.Add(lblTitle, 0, i); TextBox txtValue = new TextBox(); txtValue.Text = "2"; txtValue.Name = "txt_numberSabad" + (i + 1); // 修正命名逻辑 tableLayout.Controls.Add(txtValue, 1, i); } }
Form加载时的代码:
private void Form_load(object sender, EventArgs e) { DynamicObjects(5); TextBox txt = (TextBox)(tableLayout.Controls["txt_numberSabad3"]); if (txt != null) // 添加空判断 { txt.Text = "new text for texBox"; } }
内容的提问来源于stack exchange,提问作者beehroid
相关产品推荐
相关产品推荐

