1

こんにちは私はC#にかなり新しいですVS2012をダウンロードして私の新しいアプリケーションを作成しました、しかし私は本当に奇妙な例外を取得しています、私はそれが私のせいだと思いますが、これも本当に新しいです

form1が作成したform2を閉じるときに例外が発生します。これは、オブジェクトがform2に配置された場合にのみ発生します。

それぞれに2 formsボタンがあり、form1のボタンはform2を呼び出します。form2が閉じられると、form1が再び表示され、数秒後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();
    }
}

これがスタックトレースです

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: 
4

2 に答える 2

0

2つのフォームを使用してプログラムするだけの場合は、一方を他方のボタンから呼び出すことも、次のように簡単に行うことができます。

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

そして、これ以上、エラーなしでいつでも2番目のフォームを閉じることができます(私はこれをvs12でテストしました)。ボタンをクリックするたびに、Form2の新しいインスタンスが作成されます。したがって、クリックするたびにform2の同じインスタンスを1つだけ表示したい場合は、少し注意が必要です。

于 2012-12-19T03:14:23.697 に答える
0

それをキャンセルして非表示にします..次のように:

private void Form2_FormClosing(object sender, FormClosingEventArgs e) {
    e.Cancel = true;
    this.Hide();
    frm.Show();
}
于 2012-12-19T03:07:23.377 に答える