問題
Web フォームがあり、一部のパネルを表示または非表示にしたいと考えています。「パネル」と言うとき、Panel
コントロールを意味するのではなく、html 内の単なるペイン (通常は DIV で表される) を意味します。
このパネルを好きなように表示したり隠したりしたいのですが... 制限がないということは、必ずしも 1 つのペインだけが表示される必要があるわけではなく、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;
残念ながら、これらのパネルにはコントロールが含まれており、その一部は最初から表示されていません (最初の Web フォームの読み込みのため、何も起こらない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は表示されていません。
いくつかの操作の後、pane2 が表示され、そのコントロールも表示されます。
ユーザーが lb1 をクリック -->
ViewState error
同じことが、pane2 のコントロールに関連付けられたすべてのイベントで発生することに注意してください。lb4は押されていますが、問題ありません。
問題は、最初の階層がペイン 1 と 3 のコントロールによって表されることです。最初の階層の一部ではないコントロールによってイベントが発生した場合、ViewState
一貫性がないことがわかります (私が行動するためHtmlControls
、通常ServerControls
はよりインテリジェントであり、コントロールがより適切に ViewState を管理できるため)それらの中に追加されます)。
実現可能なソリューション
パネルを非表示および表示するには、次のように簡単に実行できることに注意してください。
this.mypane2.Attributes.Add("display", "none");
これは、次の 2 つの理由からやりたくないことです。
ペインを Html としてレンダリングしないようにします。
サーバー コントロールを使用したいと思います。
リクエスト
パネル管理を管理するために Web コントロールを使用する必要がありますHtmlControl
。コントロール階層が正しくロードされていないため、s を使用できません。
ビュー コントロールを試しMultiView
てみましたが、アクティブなビューを 1 つしか使用できません。どのようにできるのか?
注: 問題にあまり焦点を合わせないでください。ViewState
これは、何が起こるかを知らせる良い説明です。私の唯一の関心は、サーバー コントロールを使用してペインを自由に非表示および表示する方法を見つけることです。
ありがとうございました