Это случалось много раз прежде, но я так и не удосужился понять, почему, и теперь я устал от этого:
Например, я извлекаю класс из RichTextBox или Panel, я перестраиваю свой проект, чтобы добавить класс в панель инструментов дизайнера VS, а затем перетаскиваю пользовательский элемент управления в форму. Все отлично работает, и я могу запустить свой проект ...
Проблема возникает, когда я редактирую свойства формы или пользовательского элемента управления через конструктор. Иногда дизайнер удаляет строку инициализации из своего кода, что вызывает исключение в конструкторе и исполняемом файле, поскольку элемент управления остается неинициализированным.
Другими словами, следующая строка удаляется, скажем, из Form1.Designer.cs:
this.customRichTextBox1=new CustomRichTextBox();
Никакая другая строка не удаляется из выделенного кода, поэтому атрибуты пользовательского элемента управления по-прежнему установлены, хотя переменная остается неинициализированной.
Мое решение всегда состояло в том, чтобы вручную инициализировать мой пользовательский элемент управления в коде разработчика, но дизайнер в конечном итоге удаляет его снова.
Я считаю, что этого не происходит, когда я создаю Custom UserControl через конструктор (но я не совсем уверен в этом). Это происходит только тогда, когда я определяю что-то вроде следующего вручную:
class CustomRichTextBox:RichTextBox{}
Это так раздражает. Что я делаю не так?
По просьбе @Cody, здесь приведены шаги по воспроизведению проблемы. Я использую VS2010, но у меня эта проблема с 2005 года, я думаю.
Шаг 1. Создайте новое приложение Windows Forms, любой Framework
Шаг 2. Добавьте следующий класс ниже основного класса Form: (Бывает, что этот элемент управления вызывает у меня эту проблему в этот раз.)
class CustomRichTextBox : RichTextBox
{
Timer tt = new Timer();
internal CustomRichTextBox()
{
tt.Tick += new EventHandler(tt_Tick);
tt.Interval = 200;
}
protected override void OnTextChanged(EventArgs e)
{
tt.Stop();
tt.Start();
}
void tt_Tick(object sender, EventArgs e)
{
System.Diagnostics.Trace.WriteLine("Hello world!");
}
}
Шаг 3. Нажмите F6, чтобы восстановить.
Шаг 4. Добавьте элемент управления CustomRichTextBox в форму, перетаскивая его из панели инструментов.
Шаг 5. При желании вы можете нажать F5, чтобы протестировать приложение, но оно должно работать. Закройте работающее приложение.
Шаг 6. Нажмите F6, чтобы перестроить, и на этом этапе конструктор должен аварийно завершить работу со следующим сообщением: «Переменная 'customRichTextBox1' либо необъявлена, либо никогда не была назначена». (В одном случае вся VS полностью рухнула, но ошибка обычно содержится в конструкторе.)
Шаг 7. Чтобы исправить проблему, перейдите к выделенному коду и инициализируйте переменную, но при следующем перестроении строка инициализации исчезнет.