asp.net用户控件元素为null

时间:2012-01-03 09:25:35

标签: c# 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,表示TextField为null ...

我无法弄清楚原因。

3 个答案:

答案 0 :(得分: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);
  }

答案 1 :(得分:0)

尝试使用相同的代码,但在页面预渲染应该可以工作。

答案 2 :(得分: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

之前创建控件