2013-07-25 1 views
5

Шаг 1: Создать inhered класс управленияПочему New() срабатывает дважды в моих унаследованных элементах управления? (WinForms)

Public Class Test_Control 
    Inherits ListBox 

    Public Sub New() 
     Items.Add("test") 
    End Sub 
End Class 

Шаг 2: класс Drag, чтобы сформировать в конструкторе

enter image description here

Шаг 3: Запуск проекта

Результат:

enter image description here

Почему это происходит ?! Я здесь полностью в тупике. У меня есть googled и googled, и я не могу найти никакого решения или ответа на это.

Это вызывает некоторые серьезные проблемы для меня. Я просто пытаюсь добавить первоначальный вариант «Выбрать один ...» для каждого вновь созданного Combobox. То же самое происходит с каждым унаследованным классом управления, независимо от типа управления (textbox/combobox/listbox/etc).

То же самое происходит, если я использую окно сообщений в New(). Когда я запустил приложение, появятся два окна сообщений.

enter image description here

+2

Вы уверены, что это исполняется дважды, и вы не просто имеете первый «тест», предварительно приготовленный в дизайнере? – JosephHirn

ответ

5

Вы должны сообщить дизайнеру не сериализовать коллекцию пунктов:

Public Class Test_Control 
    Inherits ListBox 

    Public Sub New() 
    Items.Add("test") 
    End Sub 

    <DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)> _ 
    Public Shadows ReadOnly Property Items As ListBox.ObjectCollection 
    Get 
     Return MyBase.Items 
    End Get 
    End Property 
End Class 

Что касается двух сообщений, то MessageBoxes просто не являются хорошим инструментом отладки. Вероятно, вы получаете конструктор WinForms, который вызывает новый, в то время как среда выполнения также вызывает новое (или что-то в этом роде).

+0

Парень узнает что-то новое каждый день. Я не знал, что это необходимо, чтобы не создавать код дизайнера. –

+1

Вопрос: почему не работает 'Not Me.DesignMode'? –

+0

Это отличный ответ, спасибо .. и он исправляет проблему до тех пор, пока элементы списка не идут. Кажется, когда я запускаю проект (F5), конструктор срабатывает во время процесса сборки. Затем он срабатывает снова в тот момент, когда приложение запускается. Следовательно, два окна сообщений. Кажется, что это два отдельных вопроса. Один из них - сериализация конструктора, а другой - сборщик конструктора во время сборки.Когда я запускаю приложение вручную из папки отладки, двойные окна сообщений не отображаются. – user1003916

2

Первый test от дизайнера, и вы добавляете второй в конструкторе.

Либо удалите test из конструктора или очистить детали в конструкторе, прежде чем добавить, например:

Items.Clear() 
+0

Один из конструкторов автоматически появляется в результате кода в конструкторе. Элемент появляется, как только я помещаю элемент управления в форму из конструктора. Но это не просто происходит с элементами списка ... он также создает два окна сообщений, если я использую MsgBox в конструкторе. См. Редактирование на мой основной пост. – user1003916

+0

Что находится в вашем файле 'Form1.vb'? –

+0

Абсолютно ничего .. никакого кода вообще. Шаги, перечисленные в моем первоначальном посте, - это именно то, что я сделал, чтобы воспроизвести это ... не больше, не меньше. – user1003916

Смежные вопросы