0

我有一个 asp.net 仪表板站点,允许用户从下拉列表中加载 HTML 模板。页面上有多种类型的 DevExpress 组件,包括 ASPxDockPanel。如果用户更改模板,我收到停靠面板已存在的错误,我想包含一个递归函数,如下面的函数,检查页面上是否存在任何 ASPxDockPanel,如果存在则删除它们。这仅适用于第一个停靠面板,然后轰炸。我认为这是因为在循环遍历一组可枚举控件时无法对其进行修改。如何在运行时循环控制并删除停靠面板?

protected void LoadTableTemplate(string selectedTemplate, int currentMode)
{
   FindAllDockPanels(this);  
}


public void FindAllDockPanels(Control ctrl)
{
    if (ctrl != null)
    {
        foreach (Control control in ctrl.Controls)
        {
            if (control is ASPxDockPanel)
            {
               ctrl.Controls.Remove(control);
               control.Dispose();
            }
            FindAllDockPanels(control);
        }
     }
}
4

1 回答 1

1

使用临时集合,如下所示:

public void FindAllDockPanels(Control ctrl) {
    if (ctrl != null) {
        List<Control> remove = new List<Control>();
        foreach (Control control in ctrl.Controls) {
            if (control is ASPxDockPanel) {
                remove.Add( control );
            }
        }
        foreach(Control control in remove) {
            control.Controls.Remove( control );
            control.Dispose(); // do you really need to dispose of them?
        }
        FindAllDockPanels(control);
    }
}

如果您发现自己经常这样做,可能值得将这些“DelayedDelete”操作移至扩展方法,如下所示:

public static void DelayedRemove<T>(this IEnumerable<T item> collection, T itemToRemove) {
    // add it to a private static dictionary bound to the `collection` instance.
}
public static void DelayedRemoveFinish(this IEnumerable<T item> collection) {
    // empty the private static dictionary in here
}

然后你会像这样使用它:

    public void FindAllDockPanels(Control ctrl) {
    if (ctrl != null) {

        foreach (Control control in ctrl.Controls) {
            if (control is ASPxDockPanel) control.Controls.DelayedRemove( control );
        }
        control.Controls.DelayedRemoveFinish();

        FindAllDockPanels(control);
    }
}

干净多了,不是吗?:)

于 2012-11-05T23:25:26.600 回答