asp.net用户控件元素为null

本文关键字:null 元素 控件 net 用户 asp | 更新日期: 2023-09-27 18:19:29

我有一个简单的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。。。

我不明白为什么。

asp.net用户控件元素为null

您应该使用LoadControl(字符串)方法而不是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);
  }

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

围绕交换这些

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之前创建控件,这是一个很好的阅读