我有一个带按钮的主窗体。
该按钮的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;
.....
}
答案 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更改此行为。
所以您应该:
重写Closing事件,这样关闭会使表单隐藏而不是被丢弃,这时您将能够多次显示同一表单:
private void MyForm_FormClosing(object sender, FormClosingEventArgs e)
{
Hide();
e.Cancel = true;
}
请注意,如果您选择第二个选项,则由您决定在表单上调用Dispose()
。
答案 2 :(得分:0)
关闭表单时,它会自动处理,因此您可以刷新它,然后使用以下方法再次显示它:
Allbook.Refresh();