Может ли Form.Show() сделать саму форму пустой после вызова?
Это действительно самая раздражающая вещь в моей жизни:
У меня есть форма, которая сохраняется вместе с моим заявлением. У меня нет кода, вызывающего какой-либо метод, который будет его уничтожать, я не хочу, чтобы он был удален по какой-либо причине, и я уверен, что если это произойдет, причина не будет в моем коде. Эта форма является пользовательской формой, которая имеет метод Next(), эта Next () просто отображает информацию о следующем элементе в форме.
Худшее произошло, когда я нажал кнопку, которая вызвала вызов Next(), и возникло исключение, говорящее "Ссылка на объект не установлена для экземпляра объекта". Какие? И вот код, я сохранил ссылку на мою форму в переменную Form под названием "currentShownForm" (за один раз показывается только одна из моих форм, все они должны жить вместе с моим приложением):
private void ShowForm(CustomRibbonForm form) { if (!form.Visible) { if (currentShownForm != null) currentShownForm.Hide(); form.Show(); currentShownForm = form; } }
и Next () вызывается так, если я нажимаю кнопку Next:
currentShownForm.Next();
Загадка находится в форме.Show(); С методом ShowForm() выше, вы думаете, что currentShowForm может быть нулевым??? Какие? Любой случай? Единственный момент, когда он нулевой, - это перед тем, как отображается первая форма После того, как будет показана первая, это будет первая форма, и любая другая следующая форма будет указана им. Так как же это становится нулевым в каком-то случае??? Код в методе ShowForm() является единственным, который может изменить ссылку на currentShownForm в моем проекте.
Это действительно сбило меня с толку, я не мог поверить в то, что видел. Боже мой, я не имел ни малейшего представления об этом, ни одной идеи, но мне пришлось попробовать самую нелепую вещь, подобную этой:
private void ShowForm(CustomRibbonForm form){
if (!form.Visible)
{
if (currentShownForm != null) currentShownForm.Hide();
currentShownForm = form;
form.Show();
}
}
Ух ты, до того как я попробовал это, я не думал, что это могло бы что-то изменить, но это работало. CurrentShownForm не был нулевым, когда я нажал кнопку Next. Какова магия обмена между двумя строками кода в ShowForm??? Я думаю только об одной причине - форма. Show () как-то избавился от самой формы? Но почему это все еще было показано?
Заметно, что моя форма - это не форма.NET (она просто наследуется от формы.NET), это пользовательская форма, и опять-таки она из библиотеки DotNetBar. Вау, у меня есть идея написать книгу о самых раздражающих вещах, которые вам следует знать при работе с DotNetBar (по крайней мере, у меня было около 5 вещей, чтобы написать, я держу пари, что будет больше, если я все еще буду использовать его).
Пожалуйста, посмотрите приведенный выше код и объясните, почему это могло произойти? Я не могу объяснить это, на самом деле, я полагаю, это ошибка.
Ваша помощь будет высоко ценится!
Спасибо!
ОБНОВИТЬ
Теперь, по крайней мере, я знаю оригинальную вещь, из которой возникает проблема, но все еще не понимаю, почему:
На самом деле моя форма имеет несколько пользовательских элементов управления, в данном случае это элемент управления CustomComboBox. Этот comboBox представляет собой элемент управления 2-в-1, состоящий из обычного ComboBox (опять же, комбинированного списка DotNetBar, а именно ComboBoxEx) и фокусируемой метки (пользовательский UserControl). Все элементы управления регистрируют событие ParentChanged, чтобы зарегистрировать некоторые события для их родительской формы, например:
protected override void OnParentChanged(EventArgs e){
if(Parent is CustomRibbonForm){
((CustomRibbonForm)Parent).RefreshControls += (s,ev) => {
Show();
Hide();
};
}
}
Моя форма имеет определенное событие RefreshControls, которое будет вызываться при необходимости. У него есть открытый метод для вызова этого события, который называется RefreshAllControls. И вызов этого метода помещается после ShowForm() в обработчик события Activated для моей основной формы (а не формы, о которой я говорю), например так:
Activated += (s,e) => {
ShowForm(myForm);
myForm.RefreshAllControls();
};
А вот что будет дальше: когда я закомментирую Show (); и Скрыть (); в методе OnParentChanged он работает нормально в обоих случаях:
protected override void OnParentChanged(EventArgs e){
if(Parent is CustomRibbonForm){
((CustomRibbonForm)Parent).RefreshControls += (s,ev) => {
//Show();
//Hide();
};
}
}
Но если нет, работает только 1 случай (currentShowForm назначается перед вызовом form.Show(). Это ближе к причине проблемы, но все еще не легко понять.
Надеюсь, у вас есть что объяснить мне с этим обновлением! Спасибо
Следующее обновление
Теперь я знаю, что currentShownForm имеет значение null, потому что первое присваивание фактически никогда не выполнялось, отображается форма, но currentShownForm = form
не выполняется, и поскольку currentShownForm изначально равен нулю, он все еще равен нулю после вызова метода ShowForm().
Это очень близко к делу, но все еще очень странно:
private void ShowForm(CustomRibbonForm form){
if (!form.Visible)
{
if (currentShownForm != null) currentShownForm.Hide();
form.Show(); //<------ I marked a break point here.
currentShownForm = form; //<----- I also marked a break point here.
}
}
После того, как в одном и том же методе отмечены две точки разрыва, следующие друг за другом, кажется, что все точки разрыва будут пройдены, но только первая пройдена. После этого отображается основной интерфейс, а вторая точка останова обходит???????? Какие?????????????? После вызова формы происходит много событий.Show(), большинство из них являются событиями в моих пользовательских элементах управления (связанных с событиями Focus, LostFocus и Paint). Это первый раз, когда я вижу такой странный шаг кода. Теперь это очень близко к делу, надеюсь, вам есть что сказать. Спасибо