在面板内的控件上使用 FindControl() 返回 null

Posted

技术标签:

【中文标题】在面板内的控件上使用 FindControl() 返回 null【英文标题】:Using FindControl() on control within panel returns null 【发布时间】:2013-11-11 14:25:00 【问题描述】:

我从一个包含一个表单和两个面板(Panel1 和 Panel2)的页面开始。 Panel2 根据用户在 Panel1 上输入的服务器主机名列表动态生成控件。在 Panel1 上按“提交”会将 Panel1 的可见性设置为 false,将 Panel2 的可见性设置为 true。按下 Panel2 上的“Submit2”按钮并由用户填写所有字段后,我想从这些控件中获取信息以进行处理。但是,我使用 FindControl("symptoms_" + i.ToString())(类似这些,取决于每个控件名称),但它返回 null。

这是我开始使用的表单,在生成控件之前:

<form id="btil_form" runat="server">
    <div>
    <asp:Panel ID="Panel2" runat="server" Visible="False">
        <asp:Button ID="Submit2" runat="server" Text="Submit" OnClick="Submit2_Click" />
        <br />
        <asp:Literal ID="result" runat="server"></asp:Literal>
        <br />
    </asp:Panel>
</form>

然后在控件生成后,页面源显示每个控件的正确ID值:

<div id="Panel2">

    <input type="submit" name="Submit2" value="Submit" id="Submit2" />
    <br />

    Hostname: g1x5554<br />Issue Reported:
    <select name="issue_1" id="issue_1">
        <option value="blank"></option>
        <!-- snip -->
        <option value="VC Profile Issue">VC Profile Issue</option>
    </select>

<br />
Symptoms: <textarea name="symptoms_1" rows="2" cols="20" id="symptoms_1"></textarea>
<br />
Problem Notes: <textarea name="notes_1" rows="2" cols="20" id="notes_1"></textarea>

***** snip *****

</div>

这里是用于添加这些控件的代码示例。症状列表是一个文本框,包含我要添加的文本框。

Panel2.Controls.Add(new Literal()  Text = "Symptoms: " );
Panel2.Controls.Add(symptomsList[litList.IndexOf(singleItem)]);

然后,我将遍历与每个主机关联的控件。这些控件中的每一个都具有相同的 ID,因此对于控件“症状”和“注释”,每个字段的 ID 将为第一个主机的“症状_1”和“注释_1”,第二个主机的“症状_2”和“注释_2” , 等等。在循环中,我尝试像这样获取控制值:

TextBox thisTB = new TextBox();
thisTB = (TextBox)Panel2.FindControl("symptoms_" + i.ToString());
thisBTIL.symptoms = thisTB.Text;

但是,显然 FindControl 显然返回 null,并且尝试将 null 转换为 TextBox 会在到达 thisBTIL.symptoms = thisTB.Text; 时抛出 NullReferenceException

任何帮助将不胜感激!非常感谢。

【问题讨论】:

您使用的是母版页吗? 我不这么认为。我是 C#/ASP/.NET 的新手,我正在学习这个项目。我真的不知道什么是“母版页”。我只是在输入此评论时查找它,不,我没有创建母版页。 动态添加的控件不会出现在 PostBack 中。看看这个:forums.asp.net/t/1186195.aspx 在您的Page_Load 中您是否每次都在创建动态内容?另外,textarea != TextBox,因此您的演员阵容失败了。 啊,非常感谢,MelanciaUK。我会检查一下。看来这是我的问题。 【参考方案1】:

我建议将您的投射逻辑重写为:

TextBox thisTB = Panel2.FindControl("symptoms_" + i.ToString()) as TextBox;

// Check to make sure the text box exists before we try to use it
if(thisTB != null)

    thisBTIL.symptoms = thisTB.Text;

as 运算符在转换失败时不会抛出异常,而是返回null,因此需要检查if 中的null

【讨论】:

以上是关于在面板内的控件上使用 FindControl() 返回 null的主要内容,如果未能解决你的问题,请参考以下文章

在 javascript 中查找控件

C# 获取窗体上控件的位置

VS2008中如何根据控件名字查找窗体中已经存在的控件

在网格视图中的 ASCX 控件内的控件上使用 Javascript 显示隐藏。 (ASP.NET + Javascript)

FindControl的使用方法

更新面板内的jquery datepicker在回发后消失