0

得到旧的“对象引用未设置为对象的实例”错误。为了缩写,将所有内容缩短:

.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 是 NewsArticle)。

我已经知道需要使用 LoadControl 来通过用户控件执行此操作 --- 这不是问题。问题是我无法从用户控件的构造函数访问用户控件中的 Web 控件。

我在写这个的时候突然想到:在用户控件的情况下,Page_Load 是否相当于传统意义上的构造函数,即创建一个类的实例,而传统的构造函数 public ClassName()不应该触摸或修改 UserControl?

4

1 回答 1

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 中,动态创建您的标签并添加到您的控件

于 2012-08-03T04:11:31.623 回答