我从一个带有表单和两个面板(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 会在到达时抛出 NullReferenceExceptionthisBTIL.symptoms = thisTB.Text;
任何帮助将不胜感激!非常感谢。