0

私は2つのウィンドウフォームを持っています。1つ目は初期で、2つ目は最初のボタンが押されたときに呼び出されます。これは、異なるタスクを持つ 2 つの異なるウィンドウです。両方の MVP パターンをプログラムしました。しかし、 Main() には次のものがあります。

static void Main()
{
    Application.EnableVisualStyles();
    Application.SetCompatibleTextRenderingDefault(false);
    ViewFirst viewFirst = new ViewFirst();//First Form
    PresenterFirst presenterFirst = new PresenterFirst(viewFirst);
    Application.Run(viewFirst);
}

そして、私は2番目のWindowsフォームを持っています:

ViewSecond viewSecond = new ViewSecond();//Second Form
PresenterSecond presenterSecond = new PresenterSecond(viewSecond);

最初のボタンをクリックするとすぐにこのアプリで実行したい。どうすればこれを行うことができますか? 最初の WF の私のボタンは次のとおりです。

private void history_button_Click(object sender, EventArgs e)
{
    ViewSecond db = new ViewSecond();//second Form where I have sepparate WF.
    db.Show();
}
4

2 に答える 2

1

Application.Run(Form mainForm)スレッドごとに 1 つのフォームのみを実行できます。を使用して同じスレッドで 2 番目のフォームを実行しようとするとApplication.Run、次の例外がスローされる場合があります。

System.InvalidOperationException was unhandled

Starting a second message loop on a single thread is not a valid operation. Use
Form.ShowDialog instead.

したがって、Application.Run別の を実行するために呼び出したいForm場合は、新しいスレッドで呼び出すことができます。

private void history_button_Click(object sender, EventArgs e)
{
    Thread myThread = new Thread((ThreadStart)delegate { Application.Run(new ViewSecond()); }); //Initialize a new Thread of name myThread to call Application.Run() on a new instance of ViewSecond
    //myThread.TrySetApartmentState(ApartmentState.STA); //If you receive errors, comment this out; use this when doing interop with STA COM objects.
    myThread.Start(); //Start the thread; Run the form
}

ありがとう、
これがお役に立てば幸いです:)

于 2012-12-16T04:30:46.130 に答える
0

2 番目のフォームのプレゼンターをどこに設定しているかわかりません。ViewSecond フォームを作成するときに設定する必要があります。ボタンクリックイベントでこれを試してください:

private void history_button_Click(object sender, EventArgs e)
{
    ViewSecond viewSecond = new ViewSecond();//Second Form
    PresenterSecond presenterSecond = new PresenterSecond(viewSecond);
    db.Show();
}
于 2012-12-16T04:54:07.063 に答える