Случайный сбой конструктора c # при переключении вкладок TabControl

#c# #winforms

#c# #winforms

Вопрос:

Я создал приложение forms и разместил в нем элемент управления tab. В том же проекте я добавил UserControl со всеми элементами управления, которые понадобятся для одной вкладки. Затем я поместил этот пользовательский элемент управления на вторую вкладку элемента управления tab.

Теперь, когда я открываю конструктор для изменения приложения forms, он загружается нормально (хотя это занимает больше времени, чем обычно), но при выборе второй вкладки MSVS просто зависает, сообщает, что обнаружена ошибка, и перезапускается (в большинстве случаев). Однажды мне была предоставлена возможность «отладки».

Я нажал кнопку «debug», которая открыла новое окно MVS 2005 и отобразила: «Необработанное исключение в 0x10d84c12 в devenv.exe : 0xC0000005: Местоположение чтения с нарушением доступа 0x00000000. «

Понятия не имею, что происходит … 🙁 Пробовал перезапуск, но не сработало.

Любая помощь была бы высоко оценена!

Комментарии:

1. Включает ли ваш проект какой-либо неуправляемый код или элементы управления?

2. @SLaks: Я так не думаю, но я не могу этого гарантировать. Я использую несколько элементов управления из a . dll я не писал. Это дает мне представление, я попробую удалить эти элементы управления и посмотреть, решит ли это проблему.

Ответ №1:

Вероятно, это произойдет, если ваш элемент управления завершит выполнение неуправляемого кода.

Убедитесь, что исходный код элемента управления ничего не делает, если DesignMode значение true.

Это также может произойти, если вы используете элементы управления ActiveX; попробуйте удалить их в коде, если элемент управления находится в режиме разработки.
Вы можете сделать это в Load обработчике:

 if (DesignMode)
    somePanel.Remove(someControl);
  

Комментарии:

1. Хммм, так вы имеете в виду, что элемент управления, вероятно, был создан с использованием неуправляемого кода или что он вызывает (например, через событие click) неуправляемый код, и в этом проблема? Ооо… Я использую событие «Видимые изменения», возможно, это вызывает проблему!

2. Все ваши обработчики событий не должны ничего делать if (DesignMode)

3. Что ж, теперь это работает. Я повторно добавил элементы управления и добавил if(DesignMode) в обработчик событий VisibleChanged. Интересно, вы рекомендуете добавлять этот тест ко всем обработчикам событий или только к конкретным (например, VisibleChanged, Load и т.д.)? Я не специализируюсь на CSci, поэтому я использую лучшие практики! 🙂

4. @Jon: Добавьте его в любой обработчик, который может выполняться в режиме разработки (например, не для событий мыши или клавиатуры, которые дизайнер заблокирует), который содержит код, который не должен выполняться в конструкторе.