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

时间:2013-10-31 14:16:38

标签: c# asp.net

我从一个带有表单和两个面板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>

以下是用于添加这些控件的代码示例。 symptomsList是一个TextBox,包含我要添加的文本框。

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

然后我循环浏览与每个主机关联的控件。这些控件中的每一个都具有相同的ID,因此对于控件“症状”和“注释”,每个字段的ID对于第一个主机将是“symptoms_1”和“notes_1”,对于第二个主机将是“symptoms_2”和“notes_2” , 等等。在循环中,我尝试获取控件值,如下所示:

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

然而,显然FindControl显然返回null,并且当它到达thisBTIL.symptoms = thisTB.Text;

时尝试将null转换为TextBox会抛出NullReferenceException。

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

1 个答案:

答案 0 :(得分: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,因此需要检查null中的if