第二次调用Form.Show()时出错

时间:2018-11-26 17:46:41

标签: c# winforms showdialog

我有一个带按钮的主窗体。

该按钮的OnClick可执行以下操作...

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 :(得分:0)

@ H.G。 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

答案 1 :(得分:0)

默认情况下,关闭表单将处理它。但是您可以通过overriding the Closing event更改此行为。

所以您应该:

  • 每次显示表单时都要为其创建一个新实例,并允许WinForms在用户关闭它时对其进行处置;或
  • 重写Closing事件,这样关闭会使表单隐藏而不是被丢弃,这时您将能够多次显示同一表单:

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

请注意,如果您选择第二个选项,则由您决定在表单上调用Dispose()

答案 2 :(得分:0)

关闭表单时,它会自动处理,因此您可以刷新它,然后使用以下方法再次显示它:

   Allbook.Refresh();