You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 20:02:44