我有两个自定义控件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)如果只有页眉在我的页面上(这在回发后有效)
<my:MyHeader id="header" runat="server"></my:MyHeader >
this.header.Test = "headertest"
当viewstate被持久化时,对控件层次结构中的每个控件递归地调用SaveViewState()。通过提供的代码,Header没有被添加到TestPanel的Controls集合中,因此它不在控件层次结构中,因此Header的Test属性的值丢失了。
有关如何保存和加载viewstate的更多详细信息,请阅读Understanding ASP。. NET View State.