Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 关闭窗口时调用Base.Dispose()的Winforms上的InvalidOperationException_C#_.net_Winforms_Invalidoperationexception - Fatal编程技术网

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

C# 关闭窗口时调用Base.Dispose()的Winforms上的InvalidOperationException,c#,.net,winforms,invalidoperationexception,C#,.net,Winforms,Invalidoperationexception,您好,我对c相当陌生,刚刚下载了VS2012并创建了我的新应用程序,但我遇到了一个非常奇怪的异常,我想这是我的错,但我对这一点非常陌生 关闭form1创建的form2时发生异常。仅当对象放置在form2上时,才会发生这种情况 我刚刚得到了两个表单,每个表单上都有一个按钮,表单1上的按钮调用表单2,当表单2关闭时,我再次显示表单1,几秒钟后它会在线抛出invalidoOperationException。Dispose 下面是显示异常的代码 protected override void Disp

您好,我对c相当陌生,刚刚下载了VS2012并创建了我的新应用程序,但我遇到了一个非常奇怪的异常,我想这是我的错,但我对这一点非常陌生

关闭form1创建的form2时发生异常。仅当对象放置在form2上时,才会发生这种情况

我刚刚得到了两个表单,每个表单上都有一个按钮,表单1上的按钮调用表单2,当表单2关闭时,我再次显示表单1,几秒钟后它会在线抛出
invalidoOperationException
。Dispose

下面是显示异常的代码

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

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();
        }
    }
这是表格2

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: 

取消并隐藏它。。像这样:

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

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

    //On form1
    private void button1_Click(object sender, EventArgs e)
    {
        Form2 f2 = new Form2();
        f2.Show();
    }
而且,您可以随时关闭第二个表单,而不会出现任何错误(我在vs12上对此进行了测试)。它将在每次单击按钮时创建Form2的新实例。
因此,如果每次单击都只想显示一个相同的form2实例,那么就有点麻烦了。

因为form2是form1的子对象,所以不应该处理它,而应该隐藏它。以后你可能会想再打电话给我。@BunnyPigtails但如果我不再需要它怎么办?另外,我没有显式调用Dispose,Net,它为我做了什么,不是吗?您需要重写Close方法,并将其参数之一设置为适当的标志,以清除上述异常。覆盖是在form2的源代码上完成的回答这个问题,如果有效,将给你分数:)啊,我现在知道为什么了。当窗口已经关闭时,我正在呼叫close!!!