Проблема
У меня есть веб-форма, и я хотел бы скрыть и показать некоторые панели.Когда я говорю «Панель», я имею в виду не элемент управления Panel
, а просто панель в html (обычно представленную как DIV).
Что ж, я хочу показать и скрыть эти панели, как я хочу ..Отсутствие ограничений означает, что не обязательно только одна панель должна быть видимой, а также 2, 3 или 4.
Обычно я достигал этого путем:
<div id="mypane1" runat="server">
...
</div>
<div id="mypane2" runat="server">
...
</div>
<div id="mypane3" runat="server">
...
</div>
и это:
this.mypane1.Visible = true;
this.mypane2.Visible = false;
this.mypane3.Visible = true;
К сожалению, эти панели содержат элементы управления, и некоторые из них не отображаются с самого начала (первая загрузка веб-формы, поэтому, когда PostBack
не происходит).Это приводит к проблемам при загрузке ViewState
.
Относительно загрузки ViewState
Конечно, многие, конечно, спросят об этих ViewState
моих проблемах.Ну, вкратце, дело в том, что ViewState
ошибка загрузки не проста в управлении, но в конце я могу понять следующее.
Допустим, есть:
<!-- In .aspx -->
<div id="mypane1" runat="server">
...
<asp:Literal ID="..." runat="server" ...></asp:Literal>
<asp:TextBox ID="..." runat="server" ...></asp:TextBox>
...
</div>
<div id="mypane2" runat="server">
...
<asp:LinkButton ID="lb1" OnClick="lb1_Click" runat="server" ...></asp:LinkButton>
<asp:LinkButton ID="lb2" OnClick="lb2_Click" runat="server" ...></asp:LinkButton>
<asp:LinkButton ID="lb3" OnClick="lb3_Click" runat="server" ...></asp:LinkButton>
...
</div>
<div id="mypane3" runat="server">
...
<asp:TextBox ID="..." runat="server" ...></asp:TextBox>
<asp:LinkButton ID="lb4" OnClick="lb4_Click" runat="server" ...></asp:LinkButton>
<asp:TextBox ID="..." runat="server" ...></asp:TextBox>
...
</div>
// In .aspx.cs
protected void Page_Load(...) {
if (!this.IsPostBack) {
this.mypane1.Visible = true;
this.mypane2.Visible = false;
this.mypane3.Visible = true;
}
}
/// ... In the page many happens and the panes are shown and hidden ... ///
// Event Handlers
protected void lb1_Click(object sender, EventArgs e) {
...
}
protected void lb2_Click(object sender, EventArgs e) {
...
}
protected void lb3_Click(object sender, EventArgs e) {
...
}
protected void lb4_Click(object sender, EventArgs e) {
...
}
Ну, проблема в следующем.
В начале панель 2 не отображается.
После некоторых действий отображается панель2 и ее элементы управлениятоже отображается.
Пользовательский щелчок lb1 -> ViewState error
Обратите внимание, что то же самое происходит для каждого события, связанного с элементами управления pane2.Если нажата кнопка lb4, проблем нет.
Проблема в том, что начальная иерархия представлена элементами управления на панелях 1 и 3. Когда события генерируются элементами управления, а не частью, если начальная иерархия, ViewState
считается несогласованной(поскольку я действую на HtmlControls
, обычно ServerControls
более интеллектуальны и могут лучше управлять ViewState при добавлении в них элементов управления).
Возможные решения
Обратите внимание, что я мог бы просто выполнитьчтобы скрыть и показать панели:
this.mypane2.Attributes.Add("display", "none");
Это не то, что я хотел бы сделать по двум причинам:
Я хочу, чтобы панели не отображались как HTML.
Я хотел бы использовать серверные элементы управления.
Запрос
Мне нужно использовать веб-элементы управления для управления моей панелью.управления, я не могу использовать HtmlControl
s, потому что иерархия управления загружена неправильно.
Я пробовал MultiView
и элементы управления View, но они позволяют мне использовать только одно активное представление.Как я могу это сделать?
Примечание: Пожалуйста, не зацикливайтесь на проблеме ViewState
, это просто хороший способ сообщить вам, что происходит, мой единственный интерес - найти способ скрыться ипоказывать панели свободно с помощью серверных элементов управления.
Thankyou