Как сохранить конструктор Windows Forms Visual Studio от удаления элементов управления? - PullRequest
4 голосов
/ 20 апреля 2010

С несколькими моими формами я иногда сталкиваюсь со следующей проблемой: я редактирую форму, используя конструктор (Visual Studio 2008, Windows Forms, .NET 2.0, VB.NET) для добавления компонентов, только чтобы потом выяснить, что были сделаны некоторые незначительные корректировки (например, размер формы внезапно изменился на несколько пикселей), и элементы управления были удалены. Это происходит бесшумно - у методов обработки событий автоматически также удаляется суффикс Handles, поэтому они никогда не вызываются, и нет ошибки компилятора. Я замечаю это только позже или совсем не замечаю, потому что я работаю в другой области формы.

В качестве примера у меня есть форма с SplitContainer, содержащая Infragistics UltraListView слева и UltraTabControl справа. Я добавил новую вкладку и элементы управления внутри, и они работали нормально. Позже я узнал, что полоса прокрутки представления списка внезапно стала невидимой из-за выключения его размера, и по крайней мере один элемент управления был удален из другой вкладки, над которой я не работал.

Это известная проблема с WinForms Designer или с Infragistics? Конечно, я использую контроль версий, поэтому я могу сравнивать изменения и объединять удаленный код, но это утомительный процесс, который не должен быть необходим. Есть ли способы избежать этого? Есть ли для этого веская причина?

Одна подсказка заключается в том, что удаленный элемент управления может иметь код (например, обработчик события Load), который ожидает выполнения во время выполнения, а не во время разработки, и может вызывать исключение. Может ли это привести к тому, что Visual Studio удалит элемент управления?

Ответы [ 6 ]

10 голосов
/ 21 апреля 2010

Это не ответ на ваш вопрос, но помните, что вы должны использовать «DesignMode» в нагрузках.Это позволяет избежать странных неожиданных действий во время разработки.

private void EureFormAbm_Load(object sender, System.EventArgs e)
{
    if (!DesignMode)
    {
        // Your code
    } /* if */
}

или

private void EureFormAbm_Load(object sender, System.EventArgs e)
{
    if (DesignMode)
        return;
    // Your code
}
2 голосов
/ 21 апреля 2010

Если вы можете воспроизвести проблему, вы можете определить, является ли причина исключением. Запустите второй экземпляр Visual Studio и используйте «Инструменты-> Присоединить к процессу», чтобы присоединиться к первому. Затем перейдите к воспроизведению проблемы, и код должен прерваться при возникновении необработанного исключения. Информация о других исключениях (возможно, обработанных) будет видна в окне «Вывод».

1 голос
/ 21 апреля 2010

Я обнаружил, что свойство DesignMode иногда дает неожиданный результат (ответ Даниэля). Ниже приведено свойство моего базового класса управления (большинство созданных мной элементов наследуют от него), комментарии должны указывать «причину» того, что выглядит как хакерский код, но по сути это гораздо более надежно, чем сам по себе DesignMode.

    /// <summary>
    /// Indicates if the current view is being utilized in the VS.NET IDE or not.
    /// </summary>
    /// <remarks>The DesignMode property for a UserControl object will show that it is in DesignMode
    /// only if the immediate parent is viewed in the IDE; if it is a grand child of the object that is being viewed in the IDE,
    /// then the DesignMode property will not be true.
    /// This is a workaround</remarks>
    public bool InDesignMode
    {
        get
        {
            // Site.Design mode sometimes produces a better result.
            if (DesignMode || Site != null && Site.DesignMode)
                return true;
            Control parent = Parent;
            while (parent != null)
            {
                if (parent.Site != null && parent.Site.DesignMode)
                    return true;
                parent = parent.Parent;
            }

            // Note: I am not 100% sure about this one; I need to double check
            // if in design mode then entryAssembly will be null. This check is 
            // needed because DesignMode property is only true for the control
            // that is actively being designed, so child controls will be false...
            // We do check the Parent heirarchy in InDesignMode but in some 
            // cases Parent will not be set before the check is required.
            var entryAssembly = Assembly.GetEntryAssembly();
            if (entryAssembly == null)
                return true;

            return false;
        }
    }
1 голос
/ 21 апреля 2010

Это не настоящий ответ для вас, но вот еще несколько советов, которые я нашел полезными ..

A) Смотрите ответ @Daniel Dolz. Я искренне рекомендую вам ВСЕГДА делать то, что он рекомендует, за исключением случаев, когда вы избегаете вводить не-UI-код (или любой другой код) в Form_Load в целом. Это на самом деле решает много проблем, но особенно те исключения, которые появляются у дизайнеров и замедляют работу дизайнеров.

B) Насколько это возможно для человека:

Никогда не редактируйте файл designer.cs в Windows Forms .

Хорошо, иногда приходится, но это не то место, где можно заниматься обычной разработкой. Сторонние элементы управления будут содержать ошибки, которые требуют от вас, но это должен быть чрезвычайно редкий день, когда вы вносите прямое изменение в файл конструктора. Один из способов справиться с этим - если вы не хотите, чтобы дизайнер автоматически что-то настраивал, скопируйте его в обычный файл .cs. Это не охватывает все, но имейте это в виду.

C) Кроме того, знаете ли вы, что вы можете заблокировать макет с помощью IDE, чтобы предотвратить случайные щелчки мышью, которые могут все испортить? Это исключит некоторые из этих «автоматических обновлений», с которыми вы столкнетесь.

Parting Shot Я работал над большим проектом Windows Forms более двух лет непосредственно перед моим текущим проектом, и все, что я могу сказать, - это пока мы не покончили с людьми, редактирующими дизайнеров, за исключением очень мелкие правки и требовали их проверки в DesignMode, у нас не было ничего, кроме проблем. Приступая к веб-проектам, мы испытываем трудности с этой идеей, потому что мы так привыкли редактировать разметку, но designer.cs - это не то же самое, что разметка.

0 голосов
/ 21 апреля 2010

Еще одна полезная практика: не удаляйте конструкторы форм по умолчанию. IDE использует их, даже если ваша логика нет. Блокировка также полезна.

0 голосов
/ 20 апреля 2010

Я видел, как это происходило с Visual Basic 6.0 и ранним .NET, когда в ОС возникали проблемы. Пришлось сделать перезагрузку и починить.

...