我有两个自定义控件TestPanel和Header。两个都是小组。 TestPanel还包含Header。 TestPanel和Header只包含一个字符串属性Test。
我只能将Header放在我的表单上。然后它运作良好。 我可以将TestPanel放在我的表单上,它显示TestPanel + Header。然后它不能按预期工作,因为Header的ViewState丢失(或者Header.Test失去其值的另一个原因)。 这是我的代码:
public class TestPanel : System.Web.UI.WebControls.Panel
{
Header myHeader;
public string Test //Test is Header property; set/get header Test property
{
get
{
return this.MyHeader.Test;
}
set
{
this.MyHeader.Test = value;
}
}
public Header MyHeader
{
get
{
return myHeader;
}
set
{
myHeader = value;
}
}
public TestPanel()
{
}
protected override void Render(HtmlTextWriter writer)
{
writer.Write(Test);
MyHeader.RenderControl(writer);
}
}
public class Header : System.Web.UI.WebControls.Panel
{
public string Test
{
get
{
string s = (string)ViewState[ID + "Test"];
return (s == null) ? String.Empty : s;
}
set
{
ViewState[ID + "Test"] = value;
}
}
public Header()
{
}
protected override void Render(HtmlTextWriter writer)
{
writer.Write(Test);
}
}
在我的页面上,我使用:
1)如果我的表单上只有TestPanel(这在回发后不起作用):
protected void Page_Load(object sender, EventArgs e)
{
if (!Page.IsPostBack)
{
this.panel.Test = "paneltest";
}
}
protected void Unnamed2_Click(object sender, EventArgs e)
{
}
2)如果我的页面上只有Header(这在回发后有效)
<my:MyHeader id="header" runat="server"></my:MyHeader >
this.header.Test = "headertest"
答案 0 :(得分:0)
当持久化视图状态时,对于控件层次结构中的每个Control,将递归调用SaveViewState()。使用提供的代码,Header不会被添加到TestPanel的Controls集合中,因此它不在控件层次结构中,因此Header的Test属性的值将丢失。
有关如何保存和加载视图状态的更多详细信息,请阅读Understanding ASP.NET View State。