ASP.net FindControl返回null

时间:2013-09-16 07:19:23

标签: asp.net panel code-behind findcontrol

我有这样的代码

protected void Button1_Click(object sender, EventArgs e)

{
            Table t = new Table() ;
            t.ID = "T1";
            t.Visible = true;
            MyPanel.Controls.Add(t);
}

protected void Button2_Click(object sender, EventArgs e)

{
            Table t = (Table)MyPanel.FindControl("T1");
}

我有问题:Table t = (Table)MyPanel.FindControl("T1");

在变量t中,现在引用null。我看起来像应用程序不知道生成的代码隐藏 表。我是否必须将表“注册”到其他地方而不仅仅是MyPanel?谢谢你的答案。

修改 有关该问题的更多信息

我有没有masterPage的简单页面。有一个带有数字的Gridview。这个数字表示新TAble将拥有多少行和单元格。当用户选择一行时,我想创建适当的表,然后在单击第二个按钮后,我需要从表中收集信息。 OnInit或PreRender我不知道,我需要多少行。这是否意味着我的问题在技术上是不可能的?

3 个答案:

答案 0 :(得分:1)

您有Panel1,但您正在搜索名为MyPanel的表

protected void Button2_Click(object sender, EventArgs e)
{
            Table t = (Table)Panel1.FindControl("T1");
}

这应该可以让你获得表格

修改

好的,我挖出了一些旧的webForms内容,这些内容非常出色。

但是如果你想稍后在代码中与它进行交互,你必须在页面的initialize或preInit事件上添加你的表。并且你必须重新创建每次回发的控制。

public static Control FindControlRecursive(Control root, string id)
{
    if (root.id == id)
        return root;
    foreach (Control ctrl in root.Controls)
    {
        Control FoundCtl = FindControlRecursive(ctrl, id);
       if (FoundCtl != null)
            return FoundCtl;
    }
    return null;
}

你可以使用它。

table myTable = FindControlRecursive(this.Master, "T1") as Table

答案 1 :(得分:0)

执行代码OnPreRender

protected override void OnPreRender(EventArgs e)
    {
            Table t = new Table() ;
            t.ID = "T1";
            t.Visible = true;
            MyPanel.Controls.Add(t);
    }

答案 2 :(得分:-3)

ctl00 $ $ ContentPlaceHolder1 $ UrunlerRAjax1 rptCustomers

的ContentPlaceHolder - >用户控件 - >中继器

Repeater rptCustomers = this.Page.Master.FindControl("ContentPlaceHolder1").FindControl("UrunlerRAjax1").FindControl("rptCustomers") as Repeater;

Repeater rptCustomers = this.Page.Master.FindControl(" ContentPlaceHolder1")。FindControl(" UrunlerRAjax1")。FindControl(" rptCustomers")作为Repeater;

Repeater repeaterName = this.Page.Master.FindControl(" ContentName")。FindControl(" UsercontrolName")。FindControl(" repeaterName")作为Repeater;