防止动态加载的卸载控件

时间:2010-01-13 11:31:47

标签: c# asp.net asp.net-ajax user-controls

我正在使用WebForms和C#开发ASP.NET Web应用程序。

我有这个aspx页面:

<body>
    <form id="form1" runat="server">
        <asp:ScriptManager ID="ScriptManager1" runat="server">
        </asp:ScriptManager>
    <div id="divBody">
        <div id="divHeader">
            <asp:Button ID="Edit" runat="server" Text="Editar" onclick="Edit_Click" />
        </div>
        <div id="leftColumn">
            <asp:UpdatePanel ID="UpdatePanelLeft" runat="server">
                <ContentTemplate>
                    <asp:Label ID="TryText" runat="server"></asp:Label>
                    <asp:TreeView ID="DestinationTree" runat="server" ImageSet="Simple">
                        <ParentNodeStyle Font-Bold="False" />
                        <HoverNodeStyle Font-Underline="True" ForeColor="#5555DD" />
                        <SelectedNodeStyle Font-Underline="True" ForeColor="#5555DD" 
                            HorizontalPadding="0px" VerticalPadding="0px" />
                        <Nodes>
                            <asp:TreeNode Text="Raiz" Value="Raiz">
                                <asp:TreeNode Text="Destino_1" Value="Destino_1">
                                    <asp:TreeNode Text="Punto_1_1" Value="Punto_1_1">
                                        <asp:TreeNode Text="Contenido_1_1_1" Value="Contenido_1_1_1"></asp:TreeNode>
                                        <asp:TreeNode Text="Contenido_1_1_2" Value="Contenido_1_1_2"></asp:TreeNode>
                                    </asp:TreeNode>
                                    <asp:TreeNode Text="Punto_1_2" Value="Punto_1_2">
                                        <asp:TreeNode Text="Contenido_1_2_1" Value="Contenido_1_2_1"></asp:TreeNode>
                                    </asp:TreeNode>
                                </asp:TreeNode>
                                <asp:TreeNode Text="Destino_2" Value="Destino_2">
                                    <asp:TreeNode Text="Punto_2_1" Value="Punto_2_1"></asp:TreeNode>
                                    <asp:TreeNode Text="Punto_2_2" Value="Punto_2_2">
                                        <asp:TreeNode Text="Contenido_2_2_1" Value="Contenido_2_2_1"></asp:TreeNode>
                                    </asp:TreeNode>
                                </asp:TreeNode>
                            </asp:TreeNode>
                        </Nodes>
                        <NodeStyle Font-Names="Tahoma" Font-Size="10pt" ForeColor="Black" 
                            HorizontalPadding="0px" NodeSpacing="0px" VerticalPadding="0px" />
                    </asp:TreeView>
                </ContentTemplate>
            </asp:UpdatePanel>
        </div>
        <div id="rightColumn">
            <asp:UpdatePanel ID="UpdatePanelRight" runat="server">
                <ContentTemplate>
                    <asp:Label ID="Label1" runat="server" Text="Label"></asp:Label>
                </ContentTemplate>
                <Triggers>
                    <asp:AsyncPostBackTrigger ControlID="Edit" EventName="Click" />
                </Triggers>
            </asp:UpdatePanel>
        </div>
    </div>
    </form>
</body>

这是一个包含两列的标题:在左栏中有一个TreeView,在左边没有任何内容(现在有一个标签可以尝试我想做的事情)。

当用户在树视图上选择一个节点时,单击“编辑”按钮。点击事件的代码是:

protected void Edit_Click(object sender, EventArgs e)
{
    if ((DestinationTree.SelectedNode != null) &&
        (DestinationTree.SelectedNode.Depth > 0))
    {
        BaseControl baseControl = new BaseControl();
        UpdatePanelRight.ContentTemplateContainer.Controls.Clear();

        switch (DestinationTree.SelectedNode.Depth)
        {
            case 1:
                baseControl = (BaseControl)LoadControl("~/DynamicControls/Control1.ascx");
                break;
            case 2:
                baseControl = (BaseControl)LoadControl("~/DynamicControls/Control2.ascx");
                break;
            case 3:
                baseControl = (BaseControl)LoadControl("~/DynamicControls/Control3.ascx");
                break;
        }

        UpdatePanelRight.ContentTemplateContainer.Controls.Add(baseControl);
    }
}

根据节点选择的深度,将动态加载自定义控件。它可以工作,但是当用户在树视图上选择另一个节点时,原始标签将重新加载到右列。

我该如何防止这种情况?

2 个答案:

答案 0 :(得分:0)

必须在每次回发时重新创建动态控件,本文Here  关于如何保持动态控件及其状态的良好链接。

答案 1 :(得分:0)