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

本文关键字:对象引用 设置 对象 错误 实例 控件 添加 | 更新日期: 2023-09-27 18:11:30

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

首先有一个页面(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还没有被实例化。但是,我不确定在哪里从测试调用uc.Fill()。aspx……我尝试了page_preendercomplete,但这也不起作用…

(如果你看到名字不匹配…这可能不是错误…

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

好吧,我可以回答我自己的问题。我将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();
    }
}

我也遇到过类似的问题。结果系统找不到对象的引用,因为它没有被结构化/包含在[filename].aspx.designer.cs文件中。

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

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

using SomeDllInMyProject;

到表单代码。即使项目有对DLL的引用,ref也需要在code的形式中。