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。。。
我不明白为什么。
您应该使用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_Init
或Page_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之前创建控件,这是一个很好的阅读