1

私のプログラムには、 と の 2 つのフォームがformLoginありformStudentます。はformLogin、 という外部クラスを介してサーバーに接続されていますConnection。に接続を渡し、 をformStudent表示してformStudentを非表示にしようとしていformLoginます。このConnectionクラスにはフォーム用の 2 つのコンストラクターがあるため、どこにでもフォームの新しいインスタンスを作成せず、フォームを継承します。

クラスから呼び出そうとしたメソッドConnectionで、コメントに示されているエラーが表示されます。

public void SuccessfulLogin()
{
    if (this.InvokeRequired)
    {
        this.Invoke(new Action(() => SuccessfulLogin()));
        /*
        **Invoke or BeginInvoke cannot be called on a control until the window 
        handler has been created**
        */
    }
    else
    {
        formStudent.connection = formLogin.newConnection;
        formLogin.Hide();
        formStudent.Show();
    }
}

ステートメントを追加ifしてハンドルが作成されているかどうかを確認しようとしましif (IsHandleCreated)たが、ブレーク ポイントを使用すると、メソッド内のコードがまったく実行されていないように見えます。formLoginまた、変更なしで、クラスとクラスの両方にこのメソッドを配置しようとしましたConnection

アップデート:

私を正しい方向に向けてくれたKing Kingに感謝します。コードを次のように変更しました。

this.CreateHandle();
this.Invoke(new MethodInvoker(SuccessfulLogin));  

そしてsucessfulLoginこれへの方法:

public void SuccessfulLogin()
{
    if (this.InvokeRequired)
    {
        this.Invoke(new Action(() => SuccessfulLogin()));
    }
    else
    {
        formStudent = new frmStudent();
        formStudent.connection = formLogin.newConnection;
        formLogin.Hide();
        formStudent.Show();
    }
}
4

1 に答える 1

1

CreateControl()を呼び出す前に使用してみてくださいSuccessfulLogin():

 this.CreateControl();
 this.SuccessfulLogin();

その他の解決策:

  • Loadイベントハンドラで呼び出す
  • Shownイベントハンドラで呼び出す
  • イベント ハンドラーで呼び出しますHandleCreated(もちろん、Handle予期しない時点で実行時に が再作成される可能性があるため、これは何らかのフラグを使用して実行する必要がありますSuccessfulLogin)。
于 2013-09-22T06:53:55.353 に答える