Может ли Form.Show() сделать саму форму пустой после вызова?

Это действительно самая раздражающая вещь в моей жизни:

  1. У меня есть форма, которая сохраняется вместе с моим заявлением. У меня нет кода, вызывающего какой-либо метод, который будет его уничтожать, я не хочу, чтобы он был удален по какой-либо причине, и я уверен, что если это произойдет, причина не будет в моем коде. Эта форма является пользовательской формой, которая имеет метод Next(), эта Next () просто отображает информацию о следующем элементе в форме.

  2. Худшее произошло, когда я нажал кнопку, которая вызвала вызов 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). Это первый раз, когда я вижу такой странный шаг кода. Теперь это очень близко к делу, надеюсь, вам есть что сказать. Спасибо

0 ответов

Другие вопросы по тегам