Winforms上的InvalidOperationException在关闭窗口时调用Base.Dispose()

时间:2012-12-19 02:53:53

标签: c# .net winforms invalidoperationexception

您好我刚刚刚刚刚刚下载了VS#并且创建了我的新应用程序,但是我得到了一个非常奇怪的异常,我想这是我的错,但我再次真的很新

关闭form1创建的form2时会出现异常。这只发生在一个对象放在form2上时。

我得到了2 forms每个按钮,form1上的按钮调用form2,当form2关闭时我再次显示form1,几秒后它会在行base上抛出InvalidOperationException。禁用

这是代码异常的代码

protected override void Dispose(bool disposing)
        {
            if (disposing && (components != null))
            {
                components.Dispose();
            }
            base.Dispose(disposing); // here is the exceptjion
        }

这是form1

public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            var frm = new Form2(this);
            frm.Show(this);
            this.Hide();
        }
    }

这是form2

public partial class Form2 : Form
{
    private Form frm;

    public Form2(Form frm) : this()
    {
        this.frm = frm;
    }

    public Form2()
    {
        InitializeComponent();
    }

    private void Form2_FormClosing(object sender, FormClosingEventArgs e)
    {
        frm.Show();
        this.Close();
    }
}

这是stacktrace

No se controló System.InvalidOperationException
  HResult=-2146233079
  Message=Operación no válida a través de subprocesos: Se tuvo acceso al control 'button1' desde un subproceso distinto a aquel en que lo creó.
  Source=System.Windows.Forms
  StackTrace:
       en System.Windows.Forms.Control.get_Handle()
       en System.Windows.Forms.Control.get_InternalHandle()
       en System.Windows.Forms.Control.DestroyHandle()
       en System.Windows.Forms.Control.Dispose(Boolean disposing)
       en System.Windows.Forms.ButtonBase.Dispose(Boolean disposing)
       en System.ComponentModel.Component.Dispose()
       en System.Windows.Forms.Control.Dispose(Boolean disposing)
       en System.Windows.Forms.Form.Dispose(Boolean disposing)
       en PruebaExceocion.Form2.Dispose(Boolean disposing) en c:\Users\Alex\Documents\Visual Studio 2012\Projects\PruebaExceocion\PruebaExceocion\Form2.Designer.cs:línea 20
       en System.ComponentModel.Component.Dispose()
       en System.Windows.Forms.Form.WmClose(Message& m)
       en System.Windows.Forms.Form.WndProc(Message& m)
       en System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
       en System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
       en System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
  InnerException: 

2 个答案:

答案 0 :(得分:0)

取消它并隐藏它......就像这样:

private void Form2_FormClosing(object sender, FormClosingEventArgs e) {
    e.Cancel = true;
    this.Hide();
    frm.Show();
}

答案 1 :(得分:0)

如果你只是用2个表格编程,那么从另一个按钮调用一个表格也可以像

一样完成
    //On form1
    private void button1_Click(object sender, EventArgs e)
    {
        Form2 f2 = new Form2();
        f2.Show();
    }

并且不再需要,您可以随时关闭第二个表单而不会出现任何错误(我在vs12上测试了这个)。它将在每次单击按钮时创建Form2的新实例。 因此,如果您只希望每次单击都显示一个相同的form2实例,那就变得有点棘手了。