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

ASP.NET如何通过循环显示非空TextBox所在的控件行?

ASP.NET WebForms 动态生成多行控件并显示非空行的正确实现

核心问题分析

你遇到的FindControl返回null和报错,本质是动态控件的生命周期没处理对——ASP.NET WebForms中动态创建的控件必须在Page_Init阶段重建(每次回发都要),否则控件不会被纳入页面控件树,ViewState无法加载,FindControl自然找不到。

分步实现方案

1. 动态创建控件(必须在Page_Init中执行)

循环生成50行包含TextBox和DropDownList的控件,每行用一个Panel作为容器(方便控制显示/隐藏),并给每个控件设置唯一ID:

protected void Page_Init(object sender, EventArgs e)
{
    for (int rowIndex = 1; rowIndex <= 50; rowIndex++)
    {
        // 创建行容器,设置唯一ID
        Panel rowContainer = new Panel();
        rowContainer.ID = $"RowPanel_{rowIndex}";
        rowContainer.Style.Add("margin-bottom", "8px"); // 可选:加间距样式

        // 创建TextBox,设置唯一ID
        TextBox inputTxt = new TextBox();
        inputTxt.ID = $"RowTxt_{rowIndex}";
        inputTxt.CssClass = "form-control";
        rowContainer.Controls.Add(inputTxt);

        // 创建DropDownList,设置唯一ID并绑定选项
        DropDownList selectDdl = new DropDownList();
        selectDdl.ID = $"RowDdl_{rowIndex}";
        selectDdl.CssClass = "form-control";
        selectDdl.Items.AddRange(new[] {
            new ListItem("选项A", "A"),
            new ListItem("选项B", "B"),
            new ListItem("选项C", "C")
        });
        // 给TextBox和DropDownList之间加空格
        rowContainer.Controls.Add(new LiteralControl("&nbsp;"));
        rowContainer.Controls.Add(selectDdl);

        // 将行容器添加到主Panel1
        Panel1.Controls.Add(rowContainer);
    }
}

2. 控制非空行显示(在Page_Load中处理)

回发时遍历所有行容器,找到对应的TextBox,判断内容是否为空,为空则隐藏该行:

protected void Page_Load(object sender, EventArgs e)
{
    if (IsPostBack)
    {
        for (int rowIndex = 1; rowIndex <= 50; rowIndex++)
        {
            // 先找到行容器
            Panel rowContainer = Panel1.FindControl($"RowPanel_{rowIndex}") as Panel;
            if (rowContainer == null) continue;

            // 从行容器中找到TextBox
            TextBox inputTxt = rowContainer.FindControl($"RowTxt_{rowIndex}") as TextBox;
            if (inputTxt == null) continue;

            // 仅显示TextBox内容非空的行
            rowContainer.Visible = !string.IsNullOrWhiteSpace(inputTxt.Text.Trim());
        }
    }
}

关键注意事项

  • 控件创建时机:必须在Page_Init中创建动态控件,这是WebForms生命周期中重建控件的唯一正确阶段,确保回发时控件树完整,ViewState正常加载。
  • 唯一ID设置:所有动态控件(包括容器)必须设置唯一ID,否则FindControl无法准确定位,还可能引发ViewState冲突。
  • 嵌套控件查找:因为TextBox和DropDownList在Panel容器内,要先找到容器,再从容器内查找子控件,不能直接在Panel1下找TextBox(除非没有嵌套)。

内容的提问来源于stack exchange,提问作者Jay.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 09:33:39