2012-01-03 85 views
2

我有一個簡單asp.net用戶控制:asp.net用戶控制元素爲空

<%@ Control Language="C#" AutoEventWireup="true" 
    CodeBehind="QueryDefinitionItem.ascx.cs" 
    Inherits="xxx.UserControls.QueryDefinitionItem" %> 
    <link href="../Styles/Site.css" rel="stylesheet" type="text/css" /> 
    <div class="title"> 
     <h1 id="TextField" runat="server"></h1> 
    </div> 

代碼後面:

public partial class QueryDefinitionItem : System.Web.UI.UserControl 
{ 
    private string m_text; 
    protected void Page_Load(object sender, EventArgs e) 
    { 
     TextField.InnerText = m_text; 
    } 

    public void SetText(string text) 
    { 
     m_text = text; 
    } 
} 

我使用LoadControl加載編程一個實例:

protected void Page_Load(object sender, EventArgs e) 
    { 
     var control = (QueryDefinitionItem)LoadControl(typeof (QueryDefinitionItem),null); 
     control.SetText("test2"); 
     itemsPanel.Controls.Add(control);} 

然後我使用SetText函數來設置文本,並且一旦頁面加載被觸發,我得到一個NullReferenceException,它表示Tex tField爲空...

我無法弄清楚爲什麼。

+0

在什麼時候,你將控制動態? – 2012-01-03 09:34:28

+0

@RichardFriend頁面的頁面加載事件 – 2012-01-03 09:41:08

回答

3

您應該必須使用LoadControl(string)方法而不是LoadControl(Type,Param)並直接將值存儲到HtmlControl。 (有bug看看connect)。

protected void Page_Load(object sender, EventArgs e) 
{ 
} 
public void SetText(string text) 
{ 
    TextField.InnerText = text; 
} 

或者創建一個屬性,

public string Text 
    { 
     get { return TextField.InnerText; } 
     set { TextField.InnerText=value; } 
    } 

使用Page_InitPage_Load事件動態創建的控件。

protected void Page_Load(object sender, EventArgs e) 
    { 
    var control = (QueryDefinitionItem)LoadControl("~/QueryDefinitionItem.ascx"); 
    control.SetText("test2"); 
    itemsPanel.Controls.Add(control); 
    } 
+0

不起作用...仍爲空... – 2012-01-03 09:33:52

+0

@Amit你在哪裏試圖訪問該TextField。我的意思是它在哪個事件返回null。它是控件的頁面加載還是您正在創建它的頁面? – 2012-01-03 09:37:00

+0

@AVD我在頁面的頁面加載事件中創建用戶控件,並試圖在控件的頁面加載時訪問它。我也嘗試從頁面的頁面加載直接訪問它(用戶提供的方法)。 – 2012-01-03 09:39:24

0

嘗試使用相同的代碼,但在頁面預渲染應該工作。

0

交換這些圍繞

control.SetText("test2"); 
itemsPanel.Controls.Add(control); 

變爲

itemsPanel.Controls.Add(control); 
control.SetText("test2"); 

您的用戶控件將不會創造它的控制樹,直到它被添加到控制樹本身。

您也可以使用EnsureChildControls來確保它已經創建了它的控件。

public void SetText(string text) { 
    EnsureChildControls(); 
    TextField.InnerText = text; 
} 

我還建議創建的Page_Load之前,你的控制,this is a good read