Ошибка при вызове Form.Show () во второй раз - PullRequest
0 голосов
/ 26 ноября 2018

У меня есть основная форма с кнопкой.

При нажатии этой кнопки выполняется следующее ...

Form AllBook = new Form();
//Does some other processing and SQLReader querying.
AllBook.Show();

После этого я закрываю форму.Когда я пытаюсь показать это снова, я получаю эту ошибку.

System.ObjectDisposedException: 'Невозможно получить доступ к удаленному объекту.Имя объекта: «Форма». '

// objects
Form AllBook        = new Form();
ComboBox booksList  = new ComboBox();
ComboBox chapters   = new ComboBox();
Panel topPannel     = new Panel();
Panel txtPannel     = new Panel();
TextBox mainText    = new TextBox();

private void button1_Click(object sender, EventArgs e)
{
    // add objects to form
    AllBook.Controls.Add(topPannel);
    topPannel.Controls.Add(booksList);

    // get combobox items from another Method
    int chapterCount = countChapters(43);
        for (int i = 1; i <= chapterCount; i++) {
            chapters.Items.Add(i);
        }

    topPannel.Controls.Add(chapters);
    AllBook.Controls.Add(txtPannel);

    txtPannel.Controls.Add(mainText);

    AllBook.Show();
}

// count books chapters
public int countChapters(int bookNum) {
     int chapter = 0;
     switch (bookNum) {
         case 1:
            chapter = 50;
              break;
              case 2:
            chapter = 40;
              break;
              case 3:
            chapter = 27;
              break;
              case 4:
            chapter = 36;
              break;
        .....
}

Ответы [ 3 ]

0 голосов
/ 27 ноября 2018

По умолчанию закрытие формы удалит ее.Но вы можете изменить это поведение, переопределяя событие закрытия .

Так что вам следует:

  • Создавать новый экземпляр вашей формы каждый раз, когда вы ее показываетеи разрешить WinForms распоряжаться им, когда пользователь закрывает его;или
  • Переопределите событие Closing, чтобы при закрытии форма скрывалась, а не удалялась, после чего вы сможете многократно отображать одну и ту же форму:

    private void MyForm_FormClosing(object sender, FormClosingEventArgs e)
    {
        Hide();
        e.Cancel = true;
    }
    

Обратите внимание, что если вы выберете второй вариант, вам будет необходимо позвонить Dispose() в форме, когда вы закончите с ним.

0 голосов
/ 27 ноября 2018

Когда форма закрывается, она автоматически удаляется, поэтому вы можете обновить ее, прежде чем снова показывать, используя:

   Allbook.Refresh();
0 голосов
/ 26 ноября 2018

@ HG Sandhagen и @LarsTech верны.

Закрытие должно уничтожить форму.Если вы хотите показать это снова, вам нужно ...

Form AllBook = new Form();
AllBook.Show();

... каждый раз.

Редактировать: Добавление дополнительных пояснений.Закрытие формы также вызывает Disopose ().

Источник:

Когда форма закрыта, все ресурсы, созданные внутри объекта, закрываются и форма удаляется.Вы можете предотвратить закрытие формы во время выполнения, обработав событие Closing и установив свойство Cancel для объекта CancelEventArgs, переданного в качестве параметра обработчику события.Если форма, которую вы закрываете, является формой запуска вашего приложения, ваше заявление заканчивается.

https://docs.microsoft.com/en-us/dotnet/api/system.windows.forms.form.close?view=netframework-4.7.2

...