向面板添加控件使我“对象引用未设置为对象的实例”错误

时间:2011-10-16 23:57:29

标签: c# asp.net user-controls page-lifecycle

尝试动态添加动态生成内容的用户控件。用户控件无法获取面板上的控件来放置控件。

首先我有一个页面(test.aspx):

<head runat="server">
    <title></title>
</head>
<body>
    <form id="form1" runat="server">
    <asp:Panel ID="Panel1" runat="server">
    </asp:Panel>
    </form>
</body>
</html>
代码背后的代码:

public partial class test : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        TestUserControl uc = new TestUserControl();
        Panel1.Controls.Add(uc);
        //this is where the error happens:
        uc.Fill();
    }
}

然后这是用户控件:

    <asp:Panel ID="pnlTest" runat="server" >
    </asp:Panel>

和背后的代码:

public partial class TestUserControl: System.Web.UI.UserControl
{
    protected void Page_Load(object sender, EventArgs e)
    {
    }
    public void Fill()
    {
        Label lbl = new Label();
        lbl.Text = "test";
        //This is where pnlTest is null and I get "Object Reference Not Found..."
        pnlTest.Controls.Add(lbl);
    }
}

所以......看起来我正在调用Fill()的点是在渲染用户控件之前,因此pnlTest尚未实例化。但是,我不确定从test.aspx调用uc.Fill()的位置...我尝试了Page_PreRenderComplete,但这也不起作用......

(如果你看到一个名字不匹配......这可能不是错误......名称已被更改以保护无辜者)

3 个答案:

答案 0 :(得分:8)

欢呼,我可以回答我自己的问题。 我将test.aspx.cs更改为:

public partial class test : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
    }
    protected void Page_Init(object sender, EventArgs e)
    {
        TestUserControl uc = (TestUserControl)Page.LoadControl("~/UserControls/TestUserControl.ascx");
        Panel1.Controls.Add(uc);
        uc.Fill();
    }
}

答案 1 :(得分:0)

我有类似的问题。事实证明,系统无法找到对象的引用,因为它尚未在[filename].aspx.designer.cs文件中进行结构化/包含。

  

停止代码以添加面板,然后重新构建解决方案   应确保添加此引用,这应该修复该对象   引用异常问题。

答案 2 :(得分:0)

Windows窗体应用程序中的类似问题-需要添加

using SomeDllInMyProject;

到表单代码。即使该项目引用了DLL,引用也必须采用表单代码。