【问题标题】:Dynamically Added UserControl disappears when I click on it当我点击它时,动态添加的用户控件消失了
【发布时间】:2012-01-20 03:34:06
【问题描述】:

我在 UpdatePanel 中有这样的控件

<asp:ScriptManager ID="ScriptManager1" runat="server"></asp:ScriptManager>
<asp:UpdatePanel ID="UpdatePanel1" runat="server">
    <ContentTemplate>
        Step 1 (Choose a Widget to Manage)<br />
        <asp:DropDownList ID="DropDownWidgetSelection" runat="server"  
            OnSelectedIndexChanged="DropDownWidgetSelection_SelectedIndexChanged" 
            AutoPostBack="True">
        </asp:DropDownList>
        <div id="WidgetAdminControls" runat="server"></div>
    </ContentTemplate>
</asp:UpdatePanel>

当一个 Item 被选中时,它会向 WidgetAdminControls 添加一个新的 UserControl WidgetAdminControls.Controls.Add(widget);

但是,当我单击控件时,我认为是因为页面已重建或某些原因,并且它不知道动态添加的 UserControl。

我该如何解决这个问题?

【问题讨论】:

    标签: c# asp.net webforms


    【解决方案1】:

    你是对的,页面是重建的,因此你必须在每次部分或完整的回发时重新创建控制树。

    要做到这一点,您必须使您的页面有状态或包含足够的信息以在每次往返时重新创建控制树。每种方法都有其优点/缺点。

    有状态

    有状态页面很可能会使用 Session;必须注意不要将太多数据转储到 Session 中并正确清理(我通常使用管理器来包装 Session 并管理用户一次可以拥有多少活动对象)。好处是 Session(即使在进程之外)非常快速和安全。

    往返

    此方法使用 URL 中的 ViewState、隐藏字段或信息。如果信息包含在页面中,它应该以 字节 为单位,即它应该非常小。它也不能免于篡改。

    好处是你真的不需要做太多事情来完成这项工作,也不需要清理过程。

    数据库

    或者,您可以在每次单击时将更改保存到数据库并从数据库重建树,但我通常不喜欢这种方法,除非单击表示非常重要的事件并且数据是完整的并且验证。

    非常简单的例子

    这是一个使用 Session 来维护控制树的示例。这应该可以,但它并不能解决很多问题,例如用户在同一会话中打开同一页面的另一个副本。管理控制树会变得相当复杂。

    private List<string> _listOfStrings
    {
       get
       {
         return (List<string>)Session["_listOfStrings"];
       }
       set
       {
         Session["values"] = value;   
       }
    }
    
    protected override OnInit( EventArgs e )
    {
        if( !Page.IsPostback )
        {
            _listOfStrings = new List<string>();
        }
    
        BuildControlTree();
    }
    
    private void BuildControlTree()
    {
       foreach( string s in _listOfStrings )
       {
         // add a control to the control tree
       }
    }
    
    protected void btnAddItem_Click( object sender, EventArgs e )
    {
        _listOfStrings.Add( "some new item" );
    
        // insert the control into the tree
    }
    

    【讨论】:

    • 你能举个例子说明我该怎么做吗?
    • @jax - 我已经用一些选项和示例更新了我的答案。 Web表单中的控制树处理起来很麻烦;我已经编写了一个完整的库来抽象流程并避免一遍又一遍地编写“管道”代码来管理它。
    【解决方案2】:

    Dynamically 添加的控件必须在每次回发时实例化和初始化。因此,在这种情况下,您必须在 page_init/load 事件中加载该控件。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-12-23
      • 2014-08-25
      • 2011-11-20
      • 2021-12-24
      • 1970-01-01
      • 2015-03-26
      • 2017-04-14
      • 1970-01-01
      相关资源
      最近更新 更多