何をしているのか。
フォームを複数使うときの記述法をいつも忘れては調べ、忘れては調べ…を繰り返してる気がしたので、ここで書き残しておけば便利かな、っていうお話。
やりたいことは、
「親フォームにある情報を、子フォームに表示する」
ということ。
親から子に情報を渡してみる
メインフォームにListView
があって、DBとかから必要な情報を引っ張ってきて表示。
で、その項目の編集をするときに専用の編集用フォームを表示して、そっちで値を変更するようなとき…。
/*
メインフォームには、
・listView_Result
→DBから引っ張ってきた情報を表示
Colummは4つあり、DBには
それらに加えてID用のColumnがある
・button_Add
→「新規登録」ボタン
・button_Edit
→「項目編集」ボタン
が配置されている。
*/
// ID格納用リスト
private List<int> savedIDList = new List<int>();
/// <summary>
/// 「編集」ボタンクリック
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void button_Edit_Click(object sender, EventArgs e)
{
// 項目が選択されていれば
if (this.listView_Result.SelectedItems.Count == 1)
{
// 編集用フォームを表示
Form_Edit f = new Form_Edit();
// プロパティを指定
f.EditID = this.savedIDList[this.listView_Result.SelectedItems[0].Index];
f.EditName = this.listView_Result.SelectedItems[0].SubItems[0].Text;
f.EditItem01 = int.Parse(this.listView_Result.SelectedItems[0].SubItems[1].Text);
f.EditItem02 = int.Parse(this.listView_Result.SelectedItems[0].SubItems[2].Text);
f.EditItem03 = int.Parse(this.listView_Result.SelectedItems[0].SubItems[3].Text);
f.ShowDialog(this);
f.Dispose();
this.dataLoad();
}
else
{
MessageBox.Show("編集したい項目を選択してください。");
}
}
/*
編集用フォームには
・textBox_Name
・numericUpDown_Item01
・numericUpDown_Item02
・numericUpDown_Item03
・button_OK
→「更新」ボタン
・button_Cancel
→「キャンセル」ボタン
が配置されている。
IDはDBから自動的に決定するので、プロパティは必要ない。
*/
/* プロパティを設定 */
private int _editID;
public int EditID
{
get { return _editID; }
set { _editID = value; }
}
private string _editName;
public string EditName
{
get { return _editName; }
set { _editName = value; }
}
private int _editItem01;
public int EditItem01
{
get { return _editItem01; }
set { _editItem01 = value; }
}
private int _editItem02;
public int EditItem02
{
get { return _editItem02; }
set { _editItem02 = value; }
}
private int _editItem03;
public int EditItem03
{
get { return _editItem03; }
set { _editItem03 = value; }
}
/// <summary>
/// フォームロード
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void Form_Edit_Load(object sender, EventArgs e)
{
// フォーム表示時に各コントロールの内容をプロパティから決定する
this.textBox_Name.Text = this.EditName;
this.numericUpDown_Item01.Value = this.EditItem01;
this.numericUpDown_Item02.Value = this.EditItem02;
this.numericUpDown_Item03.Value = this.EditItem03;
}
こんな感じ。大切なのは
「子フォームから親フォームの情報を触れないようにする」
という点。
当たり前のことといえば当たり前のことなんだけども、忘れやすいというかなかなか覚えられないので…。
子から親に情報を渡してみる
じゃあ逆に、
「子フォームで入力した情報を親フォームに返す」
ということをしてみたい。
今回は相互で情報を受け渡しする例ということで、ごくごく簡単なプログラムで書いてみよう。
Form_Mainを親、Form_Editを子として、TextBoxとButtonが各フォームに1つずつ設置されている。
親Buttonをクリックすることで子フォームを表示し、親TextBoxに入力していた情報を子TextBoxに表示。
子Buttonをクリックすることで子フォームを消去し、子TextBoxに入力していた情報を親TextBoxに表示。
以下がそのコード。
/// <summary>
/// コンストラクタ
/// </summary>
public Form_Main()
{
InitializeComponent();
}
/// <summary>
/// 「開く」ボタンクリック
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void button_Edit_Click(object sender, EventArgs e)
{
using (Form_Sub subForm = new Form_Sub())
{
// プロパティに値を設定して子フォームを開く
subForm.InputText = this.textBox_Main.Text;
subForm.ShowDialog(this);
// 子フォームで設定されたプロパティから値を反映する
this.textBox_Main.Text = subForm.InputText;
}
}
/* プロパティの設定 */
public string InputText { get; set; }
/// <summary>
/// コンストラクタ
/// </summary>
public Form_Sub()
{
InitializeComponent();
}
/// <summary>
/// フォームロード
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void Form_Sub_Load(object sender, EventArgs e)
{
// プロパティに設定された値をテキストボックスに反映する
this.textBox_Edit.Text = InputText;
}
/// <summary>
/// 「閉じる」ボタンクリック
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void button_Close_Click(object sender, EventArgs e)
{
//プロパティに値を設定する
InputText = this.textBox_Edit.Text;
this.Close();
}
とまあ、特に考えずにプロパティでやりくり。
「子にプロパティを設定することで、子から親の情報を触ることができない」
というのが重要な点だと思います。
なるべく子に好き勝手されるのはやめておきたいですからね。
何かもっとよい方法がありましたらコメントで補足をお願い致します。