-1

我在这里读过几篇类似的文章,但没有找到解决问题的方法。

我正在将数据从 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;
    }
}                

这是我打开位于我的 tempGraph 的代码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 后重新打开它时,会发生错误。

4

1 回答 1

3

发生这种情况是因为您已将当前tempGraph表单的引用存储在全局变量中,并且当您关闭当前实例时,该变量仍保留对现在已处理对象的引用。

解决方案是在主窗体中获取关闭的事件并将全局变量重置为空。

所以假设改变你的菜单点击

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;
}

现在,当您tempGraph引用的表单实例tempG关闭时,您将收到通知,您可以将全局变量设置tempG为 null。当然,现在您需要在使用该变量之前到处检查,但是当您调用 tempG.Show() 时,您肯定会让它指向一个正确的 NON DISPOSED 实例。

于 2015-01-06T18:36:08.420 回答