【问题标题】:Error when calling Form.Show() a second time第二次调用 Form.Show() 时出错
【发布时间】:2018-11-26 17:46:41
【问题描述】:

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

该按钮的 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;
        .....
}

【问题讨论】:

  • 您需要向我们展示您如何“关闭表单并再次打开 AllBook 表单”。
  • 如果您关闭表单AllBooks.Close,则该表单将被释放。要再次使用它,您必须创建一个新的或使用Hide而不是Close
  • 每次点击按钮时都调用AllBook = new Form();
  • 为什么要以编程方式构建表单?只需使用 windows 窗体设计器,这样它就不会看起来一团糟,然后每次要显示窗体时都创建一个新实例
  • '因为我想要一个低内存容量计算机的程序

标签: c# winforms showdialog


【解决方案1】:

@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

【讨论】:

  • 我想这样做,但是 -- AllBook_closeForm() -- 不适合我。所以我不能在关闭它时处理表单。
  • @user2215032 我添加了说明。 AllBook.Close() 自动调用 AllBook.Dispose()。如果需要,您可以禁用它。说明在我的答案中的链接中。
  • 只做 AllBooks.Hide 而不是关闭
  • @pm100 您仍然需要在表单上创建关闭事件并设置取消属性。微软文章的链接很好地详细说明了这一点。
【解决方案2】:

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

所以你应该:

  • 每次显示时创建一个新的表单实例,并允许 WinForms 在用户关闭它时释放它;或
  • 重写 Closing 事件,这样关闭会导致表单隐藏而不是释放,此时您将能够多次显示同一个表单:

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

请注意,如果您选择第二个选项,您可以在完成后致电表单上的Dispose()

【讨论】:

    【解决方案3】:

    当表单关闭时,它会自动被释放,因此您可以在再次显示之前刷新它:

       Allbook.Refresh();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-02
      • 2012-06-26
      • 2018-05-04
      • 1970-01-01
      相关资源
      最近更新 更多