如何重新打开之前关闭的 windows 表单。 "Cannot access a disposed Object"
How to reopen a previously closed windows form. "Cannot access a disposed Object"
我在这里读过几篇类似的文章,但没有找到解决我的问题的方法。
我正在将数据从 form1 发送到我的 tempGraph 表单。一切正常,直到我关闭我的 tempGraph 表单并尝试重新打开它。当我尝试重新打开时,它说 CANNOT ACCESS A DISPOSED OBJECT
现在是我的问题。
我怎样才能再次打开我的 tempGraph?
这是我的代码,用于将数据发送到不同的表单,例如我的 tempGraph:
public void SetText(string text)//Set values to my textboxes
{
if (this.receive_tb.InvokeRequired)
{
SetTextCallback d = new SetTextCallback(SetText);
this.Invoke(d, new object[] { text });
}
else
{ var controls = new TextBox[]
{ wdirection_tb,
wspeed_tb,
humidity_tb,
temperature_tb,
rainin_tb,
drainin_tb,
pressure_tb,
light_tb
};
data = text.Split(':');
for (int index = 0; index < controls.Length && index < data.Length; index++) // This code segment Copy the data to TextBoxes
{
TextBox control = controls[index];
control.Text = data[index];
//planning to pud the code for placing data to DataGridView here.
}
//or Place a code here to Call a UDF function that will start copying files to DataGridView
//index1++; //it will count what row will be currently added by datas
if (data.Length != 0)
{ datagridreport(temperature_tb.Text.ToString(), humidity_tb.Text.ToString(), pressure_tb.Text.ToString()); }
//sending of data to each graph. THIS CODE SENDS DATA TO OTHER FORMS
tempG.temp.Text = temperature_tb.Text;
humdidG.humid.Text = humidity_tb.Text;
pressG.Text = pressure_tb.Text;
//updating textbox message buffer
this.receive_tb.Text += text;
this.receive_tb.Text += Environment.NewLine;
}
}
这是我打开位于 form1
:
中的 tempGraph 的代码
private void temperatureToolStripMenuItem_Click(object sender, EventArgs e)
{
tempG.Show();
}
然后我使用位于右上角的 X 按钮关闭我的 tempG/tempGraph 或使用带有以下命令的按钮关闭它:
private void button1_Click(object sender, EventArgs e)
{
timer1.Stop();
timer1.Enabled = false;
TempGraph.ActiveForm.Close();
}
注意:当我在关闭 tempGraph 后重新打开它时发生错误。
发生这种情况是因为您已将对当前 tempGraph
表单的引用存储在一个全局变量中,并且当您关闭当前实例时,该变量仍然持有对已处置对象的引用。
解决方案是在主窗体中获取关闭事件并将全局变量重置为 null。
所以假设将您的菜单点击更改为
private void temperatureToolStripMenuItem_Click(object sender, EventArgs e)
{
if(tempG == null)
{
tempG = new tempGraph();
tempG.FormClosed += MyGraphFormClosed;
}
tempG.Show();
}
并在您的主窗体中添加以下事件处理程序
private void MyGraphFormClosed(object sender, FormClosedEventArgs e)
{
tempG = null;
}
现在,当 tempG
引用的 tempGraph
表单实例关闭时,您将收到通知,您可以将全局变量 tempG
设置为空。当然,现在您需要在使用该变量之前检查所有地方,但是当您调用 tempG.Show() 时,您一定要让它指向一个正确的 NON DISPOSED 实例。
我在这里读过几篇类似的文章,但没有找到解决我的问题的方法。
我正在将数据从 form1 发送到我的 tempGraph 表单。一切正常,直到我关闭我的 tempGraph 表单并尝试重新打开它。当我尝试重新打开时,它说 CANNOT ACCESS A DISPOSED OBJECT
现在是我的问题。
我怎样才能再次打开我的 tempGraph?
这是我的代码,用于将数据发送到不同的表单,例如我的 tempGraph:
public void SetText(string text)//Set values to my textboxes
{
if (this.receive_tb.InvokeRequired)
{
SetTextCallback d = new SetTextCallback(SetText);
this.Invoke(d, new object[] { text });
}
else
{ var controls = new TextBox[]
{ wdirection_tb,
wspeed_tb,
humidity_tb,
temperature_tb,
rainin_tb,
drainin_tb,
pressure_tb,
light_tb
};
data = text.Split(':');
for (int index = 0; index < controls.Length && index < data.Length; index++) // This code segment Copy the data to TextBoxes
{
TextBox control = controls[index];
control.Text = data[index];
//planning to pud the code for placing data to DataGridView here.
}
//or Place a code here to Call a UDF function that will start copying files to DataGridView
//index1++; //it will count what row will be currently added by datas
if (data.Length != 0)
{ datagridreport(temperature_tb.Text.ToString(), humidity_tb.Text.ToString(), pressure_tb.Text.ToString()); }
//sending of data to each graph. THIS CODE SENDS DATA TO OTHER FORMS
tempG.temp.Text = temperature_tb.Text;
humdidG.humid.Text = humidity_tb.Text;
pressG.Text = pressure_tb.Text;
//updating textbox message buffer
this.receive_tb.Text += text;
this.receive_tb.Text += Environment.NewLine;
}
}
这是我打开位于 form1
:
private void temperatureToolStripMenuItem_Click(object sender, EventArgs e)
{
tempG.Show();
}
然后我使用位于右上角的 X 按钮关闭我的 tempG/tempGraph 或使用带有以下命令的按钮关闭它:
private void button1_Click(object sender, EventArgs e)
{
timer1.Stop();
timer1.Enabled = false;
TempGraph.ActiveForm.Close();
}
注意:当我在关闭 tempGraph 后重新打开它时发生错误。
发生这种情况是因为您已将对当前 tempGraph
表单的引用存储在一个全局变量中,并且当您关闭当前实例时,该变量仍然持有对已处置对象的引用。
解决方案是在主窗体中获取关闭事件并将全局变量重置为 null。
所以假设将您的菜单点击更改为
private void temperatureToolStripMenuItem_Click(object sender, EventArgs e)
{
if(tempG == null)
{
tempG = new tempGraph();
tempG.FormClosed += MyGraphFormClosed;
}
tempG.Show();
}
并在您的主窗体中添加以下事件处理程序
private void MyGraphFormClosed(object sender, FormClosedEventArgs e)
{
tempG = null;
}
现在,当 tempG
引用的 tempGraph
表单实例关闭时,您将收到通知,您可以将全局变量 tempG
设置为空。当然,现在您需要在使用该变量之前检查所有地方,但是当您调用 tempG.Show() 时,您一定要让它指向一个正确的 NON DISPOSED 实例。