簡體   English   中英

在運行時從asp.net頁中刪除控件

[英]Removing Controls from asp.net page at runtime

我有一個asp.net儀表板站點,允許用戶從下拉列表中加載HTML模板。 頁面上有多種類型的DevExpress組件,包括ASPxDockPanel。 如果用戶更改模板,則會收到一個錯誤消息,即該面板已經存在,我想包括一個遞歸函數,如下所示,該函數檢查頁面上是否存在ASPxDockPanels,如果存在,請將其刪除。 這僅適用於第一個擴展塢面板,然后炸毀。 我認為這是因為無法遍歷遍歷的一組無法枚舉的控件。 如何在運行時循環瀏覽控件並刪除停靠面板?

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);
        }
     }
}

使用臨時集合,如下所示:

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);
    }
}

清潔得多,不是嗎? :)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM