2012-08-03 56 views
0

得到錯誤好老「未設置爲一個對象的實例對象引用」用戶控件的Web控件。縮短一切下來縮寫的緣故:訪問從用戶控制的構造

.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"/> 

如果我把在Page_Load中的lblcategory.Text = "hello there!"線和評論它的構造函數,它工作得很好。但是,稍後,我希望能夠以編程方式添加此用戶控件的實例(即mypanel.Controls.Add(new NewsArticleContainer(x)),其中x是NewsArticle)。

我已經意識到需要使用LoadControl使用用戶控件來做到這一點---這不是問題。問題是我無法從用戶控件的構造函數訪問用戶控件中的Web控件。

寫這個時發生在我身上:在用戶控件的情況下,Page_Load是否相當於創建類的實例的傳統意義上的構造函數,以及傳統的構造函數不應該觸摸或修改UserControl的公共ClassName()?

+0

您是否嘗試過在一個成員變量存儲的值,然後再成員變量分配給負載的label.text? – 2012-08-03 04:10:48

回答

3

那麼你需要在這裏瞭解一些事情。雖然UserControl是一個類,但控件有自己的生命週期。單個控件只能在頁面生命週期/控件生命週期的初始化被調用後才能使用。在初始化之前,沒有任何控件處於初始狀態,因爲它們沒有分配給它們的唯一標識。這就是你得到對象引用錯誤的原因。你可以在這裏做什麼,如下所示

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,動態地創建標籤,並添加到您的控制

+0

權,使用頁面事件(onload,即OnRender方法等)http://msdn.microsoft.com/en-us/library/ms178472.aspx – ASpirin 2012-08-03 04:12:47

+1

非常感謝你! – CptSupermrkt 2012-08-03 04:38:58