-1

メインフォームがあります。そこから別のフォームを起動し、起動したフォームから別のフォームを起動したいです。サブフォームが表示されているときにメインフォームが編集できないようにしたいので、使用しますshowdialog()

Mainform>(Showdialog)>form1>(showDialog+dispose)>form2(dispose)>Mainform

Mainform から form2.ShowDialog() を呼び出し、次に form2 から次のコードを使用して別のフォームを起動します

this.visible=false;
form3.showdialog();
this.dispose();

しかし、これにはいくつかの問題があります。探しているものを達成するためのより良い方法はありますか?

edit:more description

私はメイン フォームを持っています。他のすべてのフォームは Mainform の上に配置し、Mainform は編集不可にする必要があります。

4

4 に答える 4

2

問題は、MainForm を (両方の) form2 と form3 の親として指定する必要があることです。パラメータを持たない ShowDialog のオーバーロードを使用すると、WinForms はアクティブなフォームを親として使用するため、form3 の親は自動的に form2 になります。次に、form2 を閉じて破棄しようとすると、form3 が孤立します。

MainForm への参照を取得する方法はいくつかありますが、最も簡単なのは次の方法です。

form2/3.ShowDialog(Application.OpenForms["MainForm"]);

MainForm の Name プロパティを "MainForm" に設定したと仮定します。

于 2012-06-29T18:09:02.730 に答える
0

ウィザードのようなものを実装しようとしているようです。最善の解決策は、すべての子フォームをメインフォームで順番に起動することです。

シーケンスに沿ってデータを渡す必要がある場合は、各ダイアログからメインフォームにデータを渡し、メインフォームから次のダイアログにデータを渡す必要があります。

于 2012-06-29T18:25:18.290 に答える
0

コードでは、 this.dispose() は form3 が閉じられた後にのみ実行されます。form3 を閉じた後に form2 を閉じたいと思うので、this.Dispose() の代わりに this.Close() を呼び出すことができます。

this.visible=false;
form3.showdialog();
this.Close();

または、form3 が表示された後は、form2 はもう必要ありません。それは次のことを意味します。

this.visible=false;
//show instead of showdialog so it wont wait until form3 is closed
form3.show();
this.Close();
于 2012-06-29T17:41:44.517 に答える
0

メインフォーム:

Form1 f = new Form1();
if (f.ShowDialog(this) == DialogResult.OK) {
    Form2 f2 = new Form2();
    f2.ShowDialog(this);
}

Form1 (ボタンをクリックするとフォーム 2 が開きます):

button1_click(object sender, EvengArgs e) {
    this.DialogResult = DialogResult.OK;
    Close();   
}
于 2012-06-29T20:28:12.740 に答える