【问题标题】:Interaction between two forms in c# (winforms) exceptionc#(winforms)异常中两个表单之间的交互
【发布时间】:2013-09-12 12:05:53
【问题描述】:

我正在开发一个 WinForm 应用程序。 我有两个表单,form1 是主窗口,form2 是设置。 我正在使用这种方法在两种形式之间进行交互:

form1 中的代码:

   private void startForm2_Click(object sender, EventArgs e)
   {
       Form2 frm = new Form2(this);
       frm.Show();
   }
   public void changeFontSize() //promenq razmera na shrifta
   {
       ...
   }

form2 中的代码:

Form1 F1 = new Form1();

public Form2(Form1 aF1)
{
    InitializeComponent();
    F1 = aF1;
}
private void button1_Click(object sender, EventArgs e)
{
    F1.changeFontSize();
}

当我关闭 form2 时,它会抛出异常:

无法访问已处置的对象。对象名称:“图标”。

排队

protected override void Dispose(bool disposing)
{
    ChangeClipboardChain(this.Handle, nextClipboardViewer); // Clean up any resources being used.
    ...

在 Form1.Designer.cs 文件中。

【问题讨论】:

    标签: c# winforms exception


    【解决方案1】:

    Form F1 = new Form1(); 字段应为 Form F1;。现在您正在创建一个根本不使用的新 Form1 实例(您覆盖了构造函数中的字段),它将被 GC 非确定性地处置和收集。

    这个“隐藏”的实例很可能是在处置时造成问题的实例。

    您也可以尝试在Form.FormClosed 事件处理程序中移动该方法,尽管它似乎更适合Dispose 方法。

    【讨论】:

      【解决方案2】:

      您应该在 Form2 关闭事件上处理所有资源。

      【讨论】:

      • 这不是真的。如果有一个Dispose 方法,作为IDisposable 接口的一部分,负责disposing 对象,则不太可能在其他地方处理对象。但在这种情况下,我不确定 P/Invoke 代码是否真的释放了一些本机资源(根据 MSDN 描述,它可能确实释放了)。
      猜你喜欢
      • 2020-03-15
      • 2014-07-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-04
      相关资源
      最近更新 更多