Мои элементы управления расположены неправильно? - PullRequest
5 голосов
/ 23 июня 2011

У меня есть следующий метод:

    public static void Disposer(Control.ControlCollection controls)
    {
        foreach (Control c in controls)
        {
            if (c.HasChildren)
                Disposer(c.Controls);

            if ((c is UltraNumericEditor)
                || (c is UltraComboEditor)
                || (c is UltraTextEditor)
                || (c is UltraDateTimeEditor)
                || (c is UltraCheckEditor)
                || (c is UltraGrid)
                || (c is UltraStatusBar))
            {
                c.Dispose();
                var x = c.IsDiposed; // this is true!
            }

        }
    }

Затем я назвал его так:

   [STAThread]
    static void Main()
    {
        Test forma = new Test();
        forma.Controls.Add(new UltraStatusBar());
        forma.Controls.Add(new UltraStatusBar());
        forma.Controls.Add(new UltraNumericEditor());
        forma.Controls.Add(new UltraComboEditor());
        forma.Controls.Add(new UltraTextEditor());
        forma.Controls.Add(new UltraTextEditor());
        forma.Controls.Add(new UltraDateTimeEditor());
        forma.Controls.Add(new UltraTimeZoneEditor());
        forma.Controls.Add(new UltraGrid());

        Disposer(forma.Controls);

        foreach (Control control in forma.Controls)
        {
            if (control.IsDisposed)//this is false now!
            {
                Debug.Write(control.Name + " was disposed");
            }
        }
    }

Мой вопрос заключается в том, почему внутри моего метода Disposer мои элементы управления распределяются, нокогда я проверяю в основном метод возвращает false ??Кстати, объект «Test» - это просто простой класс, который наследует от UserControl. Спасибо, с уважением.

1 Ответ

6 голосов
/ 23 июня 2011

В классе Control.ControlCollection есть ошибка.В нем отсутствует код для создания исключения InvalidOperationException, которое генерируют другие классы коллекции при изменении коллекции в цикле foreach.

В результате выполнения вызова Dispose () элемент управления удаляется из коллекции Controls.По сути, вы распоряжаетесь только каждым другим элементом управления.

Лучший способ расположить элементы управления, который приводит точку в исходное положение, это:

while (controls.Count > 0) controls[0].Dispose();

, хотя трудно не использоватьцикл for (), который работает в обратном направлении.Этот код почти всегда не нужен, Winforms автоматически удаляет элементы управления.И ничего не нужно утилизировать метод CreateControl () элемента управления еще не был вызван.Что не происходит, пока в форме контейнера не будет вызван и завершен метод Show ().Утилизируйте элементы управления самостоятельно только при вызове метода Controls.Remove () или Controls.Clear ().

...