ナビゲーション バーといくつかのユーザー コントロール (ascx) がプログラムで読み込まれた単純な Web ページを作成しようとしています。すべてのコントロールは更新パネル内にあります。
リンク ボタンをクリックすると (ナビゲーション バーから)、次のことを行います。
- ビューステートを使用して現在のユーザー コントロールを保存します。
- 現在のユーザーコントロールをリロードするより。
私の「page_load」は常に現在のコントロールをリロードします。
プログラムで読み込まれたコントロールに常に同じ ID を割り当てることで、ユーザー コントロールのビューステートを保存できます。したがって、1 つの小さなことを除いて、すべてが見栄えがよくなります。
(* HERE) については、以下を参照してください。「txtTest.Text」の値は常に「0」です (ポストバック中も)。
(ユーザーコントロール)Page_Loadの後にユーザーコントロールのビューステートが復元されるようです。それはどのように可能ですか?
--- "DEFAULT.ASPX": ---
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
        <asp:ScriptManager ID="sm" runat="server">
        </asp:ScriptManager>
        <asp:UpdatePanel ID="pnlMain" runat="server">
            <ContentTemplate>
                <div class="links">
                    <asp:LinkButton ID="lnkButton1" runat="server" OnClick="lnkButton1_Click" Text="Link 1"></asp:LinkButton>
                    <asp:LinkButton ID="lnkButton2" runat="server" OnClick="lnkButton2_Click" Text="Link 2"></asp:LinkButton>
                </div>
                <br />
                <asp:Panel ID="pnlCtrl" runat="server"></asp:Panel>
            </ContentTemplate>
        </asp:UpdatePanel>
    </div>
    </form>
</body>
</html>
--- "DEFAULT.ASPX.CS": ---
private string CtrlAscx
{
    get
    {
        if (ViewState["CtrlAscx"] == null)
        {
            ViewState["CtrlAscx"] = String.Empty;
        }
        return ViewState["CtrlAscx"].ToString();
    }
    set
    {
        ViewState["CtrlAscx"] = value;
    }
}
protected void Page_Load(object sender, EventArgs e)
{
    loadMyControl();
}
private void loadMyControl()
{
    if (!String.IsNullOrEmpty(CtrlAscx))
    {
        pnlCtrl.Controls.Clear();
        Control c = LoadControl(CtrlAscx);
        c.ID = CtrlAscx + "ID";         // this line is mandatory in order to mantain the usercontrol viewstate
        pnlCtrl.Controls.Add(c);
    }
}
protected void lnkButton1_Click(Object sender, EventArgs e)
{
    CtrlAscx = "Control1.ascx";
    loadMyControl();
}
protected void lnkButton2_Click(Object sender, EventArgs e)
{
    CtrlAscx = "Control2.ascx";
    loadMyControl();
}
-- 「CONTROL1.ASCX」 --
<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="Control1.ascx.cs" Inherits="WebTest.Control1" %>
Control1: <asp:TextBox id="txtTest" runat="server" Text="0"></asp:TextBox>
<asp:Button ID="btnTest" runat="server" />
-- "CONTROL1.ASCX.CS" --
public partial class Control1 : System.Web.UI.UserControl
{
    protected void Page_Load(object sender, EventArgs e)
    {
        if (txtTest.Text == "0")        // * HERE
        {
            txtTest.Text = "1";
        }
    }
}