では、どのようにしたらよいのでしょうか。いろいろな方法があると思われます。
ここでは、最も簡単な方法を採用します。
親フォームにpublicでstaticなフィールドを準備しておきます。
そして、ダイアログが閉じられようとするとき、このフィールドに書き込めばよいわけです。
さて、それとは別にダイアログボックス上のコントロールには、タブオーダーを振っておくことが一般的です。タブキーを押すごとに、タブオーダーに従って、フォーカスが移動します。これには、TabIndexプロパティを指定します。TabIndexは0以上の整数値です。また、TabIndexはTabStopプロパティがtrueの時有効です(デフォルトではtrue)。
では、サンプルのプログラムを見てみましょう。
// dialog02.cs using System; using System.Drawing; using System.Windows.Forms; class dialog02 : Form { public static string str; public static void Main() { dialog02 form = new dialog02(); Application.Run(form); } public dialog02() { Text = "猫でもわかるプログラミング"; BackColor = SystemColors.Window; MainMenu mm = new MainMenu(); MenuItem miFile = new MenuItem(); miFile.Text = "ファイル(&F)"; mm.MenuItems.Add(miFile); MenuItem miExit = new MenuItem(); miExit.Text = "終了(&X)"; miFile.MenuItems.Add(miExit); miExit.Click += new EventHandler(miExit_Click); MenuItem miOption = new MenuItem(); miOption.Text = "オプション(&O)"; mm.MenuItems.Add(miOption); MenuItem miDialog = new MenuItem(); miDialog.Text = "ダイアログを出す(&D)"; miDialog.Click += new EventHandler(miDialog_Click); miOption.MenuItems.Add(miDialog); Menu = mm; } void miDialog_Click(object sender, EventArgs e) { MyDialog dlg = new MyDialog(); DialogResult dr = dlg.ShowDialog(); if (dr == DialogResult.OK) { Invalidate(); } } void miExit_Click(object sender, EventArgs e) { Close(); } protected override void OnPaint(PaintEventArgs e) { base.OnPaint(e); Graphics g = e.Graphics; g.DrawString(str, Font, Brushes.Black, new PointF(10f, 10f)); } } class MyDialog : Form { TextBox txtBox; public MyDialog() { Text = "オプション"; MaximizeBox = false; MinimizeBox = false; ControlBox = false; ShowInTaskbar = false; FormBorderStyle = FormBorderStyle.FixedDialog; Width = 250; Height = 130; Button btnOK = new Button(); btnOK.Text = "OK"; btnOK.Location = new Point(10, ClientSize.Height - btnOK.Height - 5); btnOK.Parent = this; btnOK.TabIndex = 1; btnOK.Click += new EventHandler(btnOK_Click); btnOK.DialogResult = DialogResult.OK; Button btnCancel = new Button(); btnCancel.Text = "Cancel"; btnCancel.Location = new Point(ClientSize.Width - btnCancel.Width - 10, ClientSize.Height - btnCancel.Height - 5); btnCancel.Parent = this; btnCancel.TabIndex = 2; btnCancel.DialogResult = DialogResult.Cancel; txtBox = new TextBox(); txtBox.Parent = this; txtBox.Location = new Point(10, 10); txtBox.Width = ClientSize.Width - 20; txtBox.TabIndex = 0; } void btnOK_Click(object sender, EventArgs e) { dialog02.str = txtBox.Text; } }MyDialogクラスを見てください。OKボタンがクリックされるとbtnOK_Clickメソッドが呼び出されます。そして、dialog02.strにテキストボックスのテキストがコピーされます。
次に、dialog02クラスのmiDialog_Clickメソッドを見てください。
DialogResult dr = dlg.ShowDialog();と、いうようにダイアログボックスを見えるようにしています。ダイアログボックスが閉じられると、どのボタンが押されて閉じることになったかがdrに示されます。
もし、drがDialogResult.OKなら、Invalidateメソッドを呼んで再描画させます。
再描画の内容は、OnPaintメソッドを見るとわかりますね。
g.DrawString(str, Font, Brushes.Black, new PointF(10f, 10f));つまり、自分のクラスのstrフィールドをクライアント領域に表示しています。
では、実行結果を見てみましょう。
メニューの「オプション」「ダイアログを出す」を選択すると、左のようなダイアログボックスが出現します。
テキストボックスに適当な文字列を入力して、「OK」ボタンを押します。
親フォームのクライアント領域に、ダイアログボックスのテキストボックスに書き込んだ内容が表示されます。
Update 24/Nov/2006 By Y.Kumei