2012-01-03 86 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