无法从后面的代码定位控件

本文关键字:代码 定位 控件 | 更新日期: 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_InitgetBoxinput_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>