我有一个简单的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 ...
我无法弄清楚原因。
答案 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_Init
或Page_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
之前创建控件