画面の遷移をした最のデータの渡し方を紹介します。
簡単にできそうで、意外と書き方を忘れてしまうので、備忘録のためにも残しておきます。
実際に作ったファイルはこちらからダウンロードできます。
画面遷移とデータ渡しの概要
やることは、上のようにデータ渡しです。
流れはこんな感じです。
①子画面を立ち上げる
②選択したカレンダーの日付を選ぶ
③元画面のテキストボックスに日付が反映する
元画面から子画面への遷移するときのコード
子画面を開くコードとデータを元画面に渡すコードです。
まずはテキストボックスがクリックされたときに子画面を開くコードです。
以下は元画面のコードです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 |
/// <summary> /// テキストボックスをクリック時 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void textBox1_MouseClick(object sender, MouseEventArgs e) { try { //フラグがfalseの(子画面が開かれていない)場合 if (isSmallFrmOpened.Equals(false)) { //子画面オープンフラグを立てる isSmallFrmOpened = true; string strDate = ""; //選択日を格納 string selectedDate = ""; //登録されている日を格納 DateTime date; //[日付]のTryParse返却値格納用 //日付がテキストボックスに入力されていれば、カレンダーの子画面へセットする //日付Fromの場合 if (textBox1.Focused) { //日付に変換できる場合 if (DateTime.TryParse(textBox1.Text, out date)) { //値をセット selectedDate = textBox1.Text.Replace("年", "/").Replace("月", "/").Substring(0, 10); } } //カレンダーを表示する FrmCalender fCalender = new FrmCalender(selectedDate); fCalender.ShowDialog(); strDate = fCalender.selectedDate; //テキストボックスへ値をセット textBox1.Text = strDate; //選択状態を消す textBox1.SelectionStart = 0; } //子画面オープンフラグを戻す isSmallFrmOpened = false; } catch (Exception ex) { MessageBox.Show(ex.ToString()); } } |
説明
20~31行目はテキストボックスの値が日付型に変換できる場合は、日付に変換しています。
そして、カレンダーの子画面を開くときの引数にセットしています。
テキストボックスの値を元にカレンダーの初期値がセットできるようにしています。
35行目でカレンダーの子画面を開いています。
そして38行目でカレンダーの子画面が閉じたときに元画面で値を受け取って、テキストボックスにセットしています。
子画面から元画面へ遷移するときのコード
子画面が閉じるときに画面のプロパティを使って、元画面にデータを渡すプログラムです。
FrmCalenderは以下のように作られています。
子画面のコードです。
※selectedDt(date型)の変数はどこにグローバル変数として書いておいてください。
フォームロード
画面を開いた時に現在日になるようにしています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
/// <summary> /// フォームロード時の処理 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void FrmCalender_Load(object sender, EventArgs e) { //現在日付をカレンダーにセット monthCalendar1.SetDate(DateTime.Now); //カレンダーから日付を取得 selectedDt = monthCalendar1.SelectionRange.Start.ToShortDateString(); selectedDt = monthCalendar1.SelectionRange.Start.ToString("yyyy年MM月dd日(ddd)"); } |
子画面にプロパティの作成
子画面のプロパティを作成しておくことで、子画面から元画面へ値を返すことができます。
1 2 3 4 5 6 7 8 9 10 11 12 |
//カレンダー日付を取得、設定するためのプロパティ public string selectedDate { get { return selectedDt; } set { selectedDt = value; } } |
カレンダーの日付選択時
日付選択時に変数selectedDt にセットする処理です。
1 2 3 4 5 6 7 8 9 10 11 |
/// <summary> /// カレンダーの日付が選択された時 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void monthCalendar1_DateSelected(object sender, DateRangeEventArgs e) { //カレンダーから日付を取得 selectedDt = monthCalendar1.SelectionRange.Start.ToShortDateString(); selectedDt = monthCalendar1.SelectionRange.Start.ToString("yyyy年MM月dd日(ddd)"); } |
元画面にプロパティを使って値を渡す
selectedDateのプロパティに日付を渡して、画面を閉じています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
/// <summary> /// 確定ボタン押下時 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void buttonConfirm_Click(object sender, EventArgs e) { //日付未選択の場合 if(selectedDt.Equals("")) { MessageBox.Show("日付が選択されていません。"); return; } //プロパティにセット selectedDate = selectedDt; this.Dispose(); } |
これで完了です。
画面遷移の値渡しを実行した結果
実行した結果の画面遷移とデータ渡し結果はこんな感じになります。
①日付FROMをクリックするとカレンダーの子画面が立ち上がります。
※開いたときの現在日がデフォルトでは設定されています。
②10/30を選択して確定ボタンを押すと日付FROMのテキストボックスに10/30がセットされています。
今回はここまでです。
他にも使えそうな処理があれば、趣味で作ったプログラムから抜粋で紹介していきます。