- 締切済み
C# 親フォームと子フォームのデータのついて
こんにちは、 今開発して内容は親フォームからチェックしたリストを子フォームのdatagridviewに自動的に追加したり、 チェックを外したら、子フォームのdatagridviewから登録した項目を削除すること作成しています。 親フォームからチェックした項目(データ)を子フォームの関数に渡しているのですが、子フォームのdatagridviewの更新がしなくて、データも反映されていない状況です。 どうすれば良いでしょうか。ご存知でしたら、教えてください。 どうぞよろしくお願いします。
- みんなの回答 (2)
- 専門家の回答
みんなの回答
- Wr5
- ベストアンサー率53% (2173/4061)
>private void btn_Click(object sender, EventArgs e) >{ > Form frm = new WindowsFormsApplication1.frmDataTeble(); > frm.Show(this); >} で、作成したfrmは、btn_Click()を抜ける際に寿命が尽きます。 # 正確には「ガベージコレクション」で回収されるまで…かなぁ。 # Showメソッドで表示している(使用中)なので、表示が消えるまでは持つか。 # ただし、btn_Click()から抜けると参照する方法がない。 では… >private void checkBox_Click(object sender, System.EventArgs e) >{ > if (check.Checked) > { > dataform.Activate(); > dataform.DataSetting(test.txt); > } >} ここのdataformはいったい何者でしょう?? btn_Click()で作成したフォームとは別のモノ(別のインスタンス)ではありませんか? btn_Click()のイベントハンドラで、人間という型から田中さんを作成(frm)し立ち上がって貰い(Showメソッドで表示)ました。 どこか別の場所で、同じく人間という型から斉藤さんを作成(dataform)しています。 ただし、斉藤さんにはまだ寝たままの状態(Showメソッドは未実行)でいて貰います。 checkBox_Click()のイベントハンドラで斉藤さんに目覚めて(Activateメソッド実行)もらい、メモ用紙を渡し(DataSettingメソッド実行)ました。 # ただし斉藤さんは相変わらず寝転がったまま(Showメソッド未実行なまま)です。 メモ用紙をちゃんと渡したはずなのに、なぜ田中さんが持っているメモ用紙の内容が更新されないんでしょうか?? ということです。 インスタンスが別なのですから、表示されているフォーム(上の例なら田中さん)の内容は更新されません。 dataformを親フォームのコンストラクタで作成していて、親フォームのフィールドとしているのであれば、btn_Click()のイベントハンドラで「新しく作る」のが間違っています。
- Wr5
- ベストアンサー率53% (2173/4061)
どういうコードなのか、不明では指摘のしようもない。 とは思いませんか? >親フォームからチェックした項目(データ)を子フォームの関数に渡しているのですが、子フォームのdatagridviewの更新がしなくて、データも反映されていない状況です。 子フォームはどうやって生成しています? # あと、そのインスタンスの寿命は?
補足
ご回答ありがとうございます。 コードが長くなりますが、 (1)子フォーム作成は private void btn_Click(object sender, EventArgs e) { Form frm = new WindowsFormsApplication1.frmDataTeble(); frm.Show(this); } 子フォームの関数 public void DataSetting(string data) { this.dataGridView1.EditMode = DataGridViewEditMode.EditProgrammatically; int com = this.dataGridView1.CurrentCell.ColumnIndex; int row = this.dataGridView1.CurrentCell.RowIndex; (this.dataGridView1.Rows[c.RowIndex].IsNewRow) this.dataGridView1.InitializeLifetimeService(); if (this.dataGridView1.Rows[row].IsNewRow) { this.dataGridView1.BeginEdit(true); this.dataGridView1.EditingControl.Text = "1"; this.dataGridView1.EndEdit(); this.dataGridView1[com, row].Value = data; } if (data != null) this.dataGridView1[com, row].Value = data; this.dataGridView1.CurrentCell = this.dataGridView1[com, row + 1]; this.dataGridView1.Rows[row + 1].HeaderCell.Value = "No " + (this.dataGridView1.RowCount + 1); this.dataGridView1.Invalidate(); } 親フォームから子フォームの対して、関数でアクセスします private void checkBox_Click(object sender, System.EventArgs e) { if (check.Checked) { dataform.Activate(); dataform.DataSetting(test.txt); } } この一連の動作では、エラーなく動きましたが、子フォームのデータが表示しないし、更新もしないので、 インスタンスの寿命に関して、もっと詳しく教えていただけませんか。 どうぞよろしくお願いします。
お礼
Wr5さん 丁寧なご回答ありがとうございます。 実は同じアプリケーションで、namespaceは2つになってしまい、新規作成した子フォームと親フォームはそれぞれのnamespaceとなり、アクセスするために、dataformを定義しました。 親フォームから操作する(btn_Click()のイベントハンドラ)と、チェックしたデータを子フォームに表示するような作成したかったのです。 やはり他の方法も考えないといけないと思います。 どうもありがとうございます。