2011-05-02 50 views
9

我已經構建了一個小型的用戶控件,它實質上是一個DropDownList,它具有一些基於Target-Property設置的預設值。UserControl內的Web控件null?

下面的代碼:

public partial class Selector : System.Web.UI.UserControl 
{ 
    public string SelectedValue { get {return this.ddl.SelectedValue; } } 
    public int SelectedIndex { get { return this.ddl.SelectedIndex; } } 
    public ListItem SelectedItem { get { return this.ddl.SelectedItem; } } 
    private string target; 
    public string Target { get { return this.target; } set { this.target = value; } } 
    protected void Page_Load(object sender, EventArgs e) 
    { 
     ddl.DataSource = target=="Group"?Util.GetAllGroups(Session["sessionId"].ToString()):Util.GetAllUsers(Session["sessionId"].ToString()); 
     ddl.DataBind(); 
    } 
} 

ASP-標記:

<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="Selector.ascx.cs" Inherits="InspireClient.CustomControls.Selector" %> 
<asp:DropDownList runat="server" ID="ddl"> 
</asp:DropDownList> 

如果我插入我的選擇到一個aspx頁它工作得很好。 實施例:

<SCL:Selector Target="Group" runat="server" /> 

然而,如果我編程方式添加它像這樣

ctrl = new Selector(); 
ctrl.Target = "User"; 

DropDownList的 「DDL」 爲空並且該應用程序(邏輯)引發錯誤。 Page_Load是做錯事的錯誤方法嗎?我究竟做錯了什麼?

我應該加上「ctrl」是動態類型的,不知道這與它有什麼關係。

在此先感謝!

丹尼斯

回答

18

既然你動態地添加用戶控件,而不是一個「簡單」的網絡控制,你應該使用LoadControl()方法來實例化它:

protected void Page_Load(object sender, EventArgs e) 
{ 
    Selector yourControl = (Selector) LoadControl("Selector.ascx"); 
    yourControl.Target = "User"; 
    Controls.Add(yourControl); 
} 
+0

謝謝,這個作品!這背後的想法究竟是什麼,而不是以正常的方式實例化它? – 2011-05-02 09:55:38

+1

@Dennis,用戶控件不能真正地被「正常」實例化,因爲'ascx'文件中定義的標記必須動態地包裝在派生於代碼隱藏類的類中(「aspx」頁)。實例化代碼隱藏類只會給你一半的控制行爲。 – 2011-05-02 09:59:34

+0

這個工程!對我而言,第二行不適用。我的用戶控件上的網頁控件不再爲空!這裏是我的(幫助模式):\t IndemnitorControl indemnitorControl =(IndemnitorControl)LoadControl(「IndemnitorControl.ascx」); \t \t Controls.Add(indemnitorDataControl); – 2016-02-19 02:02:22

相關問題