向面板添加控件会使“对象引用”未设置为该对象的实例.错误
本文关键字:对象引用 设置 对象 错误 实例 控件 添加 | 更新日期: 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的形式中。