【问题标题】:Adding multiple custom controls添加多个自定义控件
【发布时间】:2015-06-25 13:46:19
【问题描述】:

我有一个自定义控件 (customContainer),它可以容纳多个 ConditionControl 类型的自定义控件。当我单击 customContainer 控件中的按钮时,我想将另一个 customControl 添加到我的容器中。

protected void ImageButton1_Click(object sender, ImageClickEventArgs e)
        {
            CustomControlsPanel.Controls.Add(new LiteralControl("<br />"));
            ConditionControl myCc = (ConditionControl)LoadControl(@"~/ConditionControl.ascx");
            CustomControlsPanel.Controls.Add(myCc);
        }

这只能工作一次。所以我单击它一次,它添加了一个条件控件,但它不再工作了。我该如何解决这个问题?

编辑:我尝试将面板的控件集合保存到会话变量中,然后使用它来恢复控件,如下所示:

protected void Page_Load(object sender, EventArgs e)
        {
            if (!Page.IsPostBack)
            {
                Session["controls"] = ConditionControlsPanel.Controls;
            }
            else
            {
                ControlCollection temp = (ControlCollection)Session["controls"];
                ConditionControlsPanel.Controls.Clear();
                foreach (Control ctrl in temp)
                {
                    ConditionControlsPanel.Controls.Add(ctrl);
                }

            }
        }

当我尝试执行 foreach 时,当我尝试添加一个新控件说 Collection was modified; enumeration operation may not execute. 时出现错误

【问题讨论】:

    标签: asp.net controls


    【解决方案1】:

    这是因为每次您单击按钮时,它都会回发、删除第一个按钮并添加新按钮。为了克服这个问题,您可以阻止回发(通过 UpdatePanel 之类的方法)或保留添加的 ConditionControls 的计数(例如在会话中)并添加与会话中保持的计数器一样多的控件

    【讨论】:

    • UpdatePanel 不会阻止回发。
    • 问题是我添加的那些控件也可以包含信息,所以如果我每次进入页面时都要创建一些控件,那么我必须保存所有这些数据某处。我必须做一些更简单的事情来解决这个问题
    • 不,它没有。回发仍然会发生,并且页面生命周期将贯穿始终。只是生命周期会通过AJAX异步发生,会是部分回发。 UpdatePanel 很难理解,在向他人推荐或尝试向他人解释它的工作原理之前,您应该确保对其有充分的了解。
    猜你喜欢
    • 2011-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多