从User Control的构造函数访问用户控件中的Web控件

时间:2012-08-03 04:06:17

标签: c# asp.net user-controls nullreferenceexception

获得好旧的“对象引用未设置为对象的实例”错误。为缩写起见缩短了所有内容:

.ascx文件:

<asp:Label ID="lblcategory" runat="server" Text="Label"></asp:Label>

.ascx.cs文件:

public partial class NewsArticleContainer : System.Web.UI.UserControl
{
    protected void Page_Load(object sender, EventArgs e)
    {

    }      

    public NewsArticleContainer()
    {
        lblcategory.Text = "hello there!"; //null reference exception
    }
}

然后,在将此用户控件注册到web.config文件后,我将其放入另一页。

.aspx文件:

<MyUC:NewsArticleContainer runat="server"/>

如果我将lblcategory.Text = "hello there!"行放在Page_Load中并将其从构造函数中注释掉,它就可以了。但是,稍后,我希望能够以编程方式添加此用户控件的实例(即mypanel.Controls.Add(new NewsArticleContainer(x)),其中x是新闻文章)。

我已经意识到要求使用LoadControl通过用户控件执行此操作 - 这不是问题所在。问题是我无法从用户控件的构造函数访问用户控件中的Web控件。

在我写这个时刚刚发生:在用户控件的情况下,可能是Page_Load相当于创建类实例的传统意义上的构造函数,并且不应该触及或修改UserControl的传统构造函数public ClassName()?

1 个答案:

答案 0 :(得分:3)

你需要在这里理解一些事情。虽然UserControl是一个类,但控件有自己的生命周期。只有在调用页面生命周期/控制生命周期的初始化后,才能使用单独的控件。在Init之前,没有任何控件被初始化,因为它们没有分配给它们的唯一ID。这就是你得到对象引用错误的原因。你在这里可以做的就是下面的

public partial class NewsArticleContainer : System.Web.UI.UserControl
{
   List<string> NewsArticle = null;
   public NewsArticleContainer(List<string> toCreateNewsArticle)
   {
      NewsArticle = toCreateNewsArticle;
   }

    protected void Page_Load(object sender, EventArgs e)
    {
       foreach(string s in NewsArticle)
       {
          //dynamically create your label control and add it to this user control
          Label lb = new Label;
          lb.Text = s;
          this.Controls.Add(lb);
       }
    }
}

传递输入并将NewsArticle存储在类级别变量中。然后在页面加载或page_init中,动态创建标签并添加到控件