【C#】【Form】 Form ~ 表示編 ~

■ モーダル/モーダルレス表示について

 * フォームの表示には、2種類ある
【1】 モーダル
 => フォームが閉じられない限り、他フォームの操作ができなくなる★重要★
【2】 モーダルレス
 => フォームを閉じなくても、他フォームの操作ができる

【1】 モーダル

 * ShowDialog()により表示する
 * フォームが不要時には、Dispose()を呼び出し、リソースを解放する

サンプル

Form2 f = new Form2();
f.ShowDialog();
f.Dispose();

【2】 モーダルレス

 * Show()により表示する(Dispose()を呼び出す必要はない)

サンプル

例1
Form2 f = new Form2();
f.Show();
http://dobon.net/vb/dotnet/form/showform.html
例2
Form2 f = new Form2();
// モードレスが常に親画面(this)よりも前に表示される
f.Show(this);
http://dobon.net/vb/dotnet/form/ownedform.html

■ 手前に表示する

Owner プロパティ

* Ownerとして設定したFormが手前に表示される
Form f = new Form();
f.Owner = this; // f : Owner
f.Show(); // fが手前に表示される

■ 二重表示させないようにする

 * モーダル表示の場合、親Formの操作が行えないので、操作性が悪い場合がある
 * モーダルレス表示の場合で、フォームが一つしか表示されないようにするやり方を記載

サンプル

private Form2 frm = null;

private void button1_Click(object sender, System.EventArgs e)
{
    if ((this.frm == null) || this.frm.IsDisposed)
    {
        this.frm = new Form2();
        this.frm.Show();
    }
}

参考:IsDisposed について

 * IsDisposed : コントロールが破棄されている場合は true。それ以外の場合は false。 
http://msdn.microsoft.com/ja-jp/library/system.windows.forms.control.isdisposed%28v=vs.80%29.aspx

参考文献

http://dobon.net/vb/dotnet/form/singleform.html
http://homepage3.nifty.com/midori_no_bike/CS/index.html?form.003

■ フォームをダイアログのように使用する

 * フォームやボタンのプロパティの使い方がキーポイントとなる

サンプル

From1.cs
private void button1_Click(object sender, EventArgs e)
{
    Form2 obj = new Form2();
    DialogResult result = obj.ShowDialog(this);

    switch (result)
    {
        case DialogResult.OK:
            this.label1.Text = "OK入りました";
            break;
        case DialogResult.Cancel:
            this.label1.Text = "Cancel入りました";
            break;
        default:
            this.label1.Text = "それ以外入りました";
            break;
    }
}
From2.cs
 * 特にプログラムは今回は必要ない(実用上では必要だと思うが)
 * ×ボタン押下後は、DialogResult.Cancelを渡すことになる

・ボタン1(button1): ボタンのプロパティDialogResultにOKにする
・ボタン2(button2): ボタンのプロパティDialogResultにCancelにする
(FormのプロパティCancelButtonにbutton2するでもいい)
一口メモ
 * プロパティDialogResultを一時的にキャンセルしたい場合、
   フォームのDialogResultに『DialogResult.None』を設定する

【詳細】
 ボタンのプロパティDialogResultにOKなどを設定した場合、
そのボタン押下後に、値をチェックなどを行った結果不正な値だったのでキャンセルしたい場合、
以下のように、『DialogResult.None』を設定してあげれば
一時的にキャンセルし、ダイアログ画面に戻る。

this.DialogResult = DialogResult.None; // この「this」は、ダイアログ自体を表す

■ 親子関係について

 * MDI(マルチ・ドキュメント・インターフェイス)フォームを作成するには、
   親子関係を設定する必要がある。

サンプル

testForm testFrm = testForm();
testForm.MdiParent = this; // ★親子関係を設定★
testForm.Show();