0

ユーザーがドロップダウンリストから HTML テンプレートをロードできるようにする asp.net ダッシュボード サイトがあります。ページには、ASPxDockPanel を含む複数の種類の DevExpress コンポーネントがあります。ユーザーがテンプレートを変更すると、dockpanel が既に存在するというエラーが表示されます。次のような再帰関数を含めて、ページに 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);
        }
     }
}
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 に答える