无法从后面的代码定位控件
本文关键字:代码 定位 控件 | 更新日期: 2023-09-27 18:05:44
我有一个问题,以获得控件/控件id,我已经从后面的代码手动创建。经过研究,我发现如果我创建表及其所有组件,包括Page_Init()方法中的任何控件,在回发后渲染时,文本框控件的文本值应该可用于页面。我试图找到使用FindControl()方法的文本框控件。当调试时,它只到达我试图使用FindControl()找到控件的行,然后抛出一个异常"对象引用未设置为对象的实例"下面是Page_Init()方法
protected void Page_Init(object sender, EventArgs e)
{
Table tb = new Table();
tb.ID = "Table1";
TableRow row1 = new TableRow();
TableCell cell1 = new TableCell();
TableCell cell2 = new TableCell();
TableCell cell3 = new TableCell();
TextBox txtbx = new TextBox();
Button btn = new Button();
cell1.Text = "Name: ";
txtbx.ID = "table1_text_input";
txtbx.ValidationGroup = "rosy";
cell2.Controls.Add(txtbx);
btn.Text = "Get the input";
btn.ValidationGroup = "rosy";
btn.Click += getBoxinput_Click;
cell3.Controls.Add(btn);
// adding cells to row1
row1.Cells.Add(cell1);
row1.Cells.Add(cell2);
row1.Cells.Add(cell3);
// adding row to table1
tb.Rows.Add(row1);
Panel1.Controls.Add(tb);
}
下面的是按钮单击事件,它应该显示控件id及其文本。这几天我都被这事缠住了。任何帮助都将不胜感激。
protected void getBoxinput_Click(object sender, EventArgs e)
{
try
{
if (IsPostBack)
{
Table t = (Table)Page.FindControl("Panel1").FindControl("Table1");
TextBox tbox;
foreach (TableRow tr in t.Rows)
{
foreach (TableCell tc in tr.Cells)
{
foreach (Control cnt in tc.Controls)
{
if (cnt.GetType() == typeof(TextBox))
{
tbox = (TextBox)cnt;
display.Text += "control id: " + tbox.ID + " control input: " + tbox.Text + "<br/>";
}
}
}
}
}
}
catch (NullReferenceException ex)
{
display.Text += ex.Message;
}
}
也许我错过了一些东西,但你为什么不把所有的控件在类的全局范围内(而不是仅仅创建Page_Init
内的实例),这样你就可以在你的类的任何部分访问它们。当然,我假设Page_Init
和getBoxinput_Click
在同一类中。
下面是如何将变量放入全局作用域的示例:
Table tb; //Declare variables outside any function.
protected void getBoxinput_Click(object sender, EventArgs e)
{
tb = new Table(); //Initialize them inside a function.
}
这样您就可以在任何函数中访问tb
。
您的代码运行良好。下面是我使用的表单标记:
<form id="form1" runat="server">
<asp:Panel ID="Panel1" runat="server"></asp:Panel>
<asp:Label ID="display" runat="server"></asp:Label>
</form>