У меня есть два пользовательских элемента управления TestPanel и Header. Оба являются панелями.
TestPanel также содержит заголовок.
TestPanel и Header содержат только одно строковое свойство Test.
Я могу указать только заголовок в моей форме. Тогда это работает хорошо.
Я могу поместить TestPanel в мою форму, и он показывает TestPanel + Header. Тогда он не работает должным образом, потому что ViewState из Header потерян (или есть другая причина, по которой 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"