• 締切済み

C# 親フォームと子フォームのデータのついて

こんにちは、 今開発して内容は親フォームからチェックしたリストを子フォームのdatagridviewに自動的に追加したり、 チェックを外したら、子フォームのdatagridviewから登録した項目を削除すること作成しています。 親フォームからチェックした項目(データ)を子フォームの関数に渡しているのですが、子フォームのdatagridviewの更新がしなくて、データも反映されていない状況です。 どうすれば良いでしょうか。ご存知でしたら、教えてください。 どうぞよろしくお願いします。

みんなの回答

  • Wr5
  • ベストアンサー率53% (2177/4070)
回答No.2

>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()のイベントハンドラで「新しく作る」のが間違っています。

xiaodoubao
質問者

お礼

Wr5さん  丁寧なご回答ありがとうございます。    実は同じアプリケーションで、namespaceは2つになってしまい、新規作成した子フォームと親フォームはそれぞれのnamespaceとなり、アクセスするために、dataformを定義しました。  親フォームから操作する(btn_Click()のイベントハンドラ)と、チェックしたデータを子フォームに表示するような作成したかったのです。  やはり他の方法も考えないといけないと思います。  どうもありがとうございます。

  • Wr5
  • ベストアンサー率53% (2177/4070)
回答No.1

どういうコードなのか、不明では指摘のしようもない。 とは思いませんか? >親フォームからチェックした項目(データ)を子フォームの関数に渡しているのですが、子フォームのdatagridviewの更新がしなくて、データも反映されていない状況です。 子フォームはどうやって生成しています? # あと、そのインスタンスの寿命は?

xiaodoubao
質問者

補足

ご回答ありがとうございます。 コードが長くなりますが、 (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); } } この一連の動作では、エラーなく動きましたが、子フォームのデータが表示しないし、更新もしないので、 インスタンスの寿命に関して、もっと詳しく教えていただけませんか。 どうぞよろしくお願いします。

関連するQ&A

  • DGV/子フォームで編集して親フォームへ

    親フォームと子フォーム、どちらにもDataGridViewを用意し、親フォームのセレクト行を子フォームに表示するというプログラムがあります。 さらに子フォームで直接DataGridViewに入力し編集して、更新ボタンを押して親フォームに反映させたいです。(関数を使いたい) ご教授お願いします(´;ω;`) Form1 private void DataGridView1_SelectedRowsDoubleClick(Object sender, MouseEventArgs e) { Form2 f2 = new Form2(); f2.setRowData(dataGridView1.SelectedRows); f2.Show(); } Form2 public void setRowData(DataGridViewSelectedRowCollection rows) { DataTable dt = createData(); foreach (DataGridViewRow r in rows) { string s1 = r.Cells[1].Value.ToString(); string s2 = r.Cells[2].Value.ToString(); string s3 = r.Cells[3].Value.ToString(); dt.Rows.Add("12345", s1, s2, s3); } dataGridViewDisp2(dt); } private void savebtn_Click(object sender, EventArgs e) { }

  • C# 親フォームと子フォーム

    今、C#のプログラミングを作成中です。 内容は、 親フォームのボタンをクリック 子フォームのコンストラクタでエラーチェック エラーがあれば、エラーメッセージを出し、子フォームを閉じる エラーがなければ、子フォームが開く というようにしたいと思っています。 今とまっているのは、エラーがあれば、エラーメッセージを出し、子フォームを閉じるという所です。 どういう風に、子フォームにプログラムしたらよろしいでしょうか? それとも、親フォームにてエラーチェックを行うしか方法はないのでしょうか? 誰か分かられる方がいらっしゃいましたら、教えてください。 お願いいたします。

  • 子フォームから親フォームのオブジェクトを参照したい。

    こんばんわ。 いまVB.Net2005でプログラミングしている者です。 子フォームから親フォームのオブジェクトを参照したいのですが, うまくいきません。 親フォームにListBox1を置き, ここに入力された内容を 子フォームで下記のように参照しようとしました。 Dim 子フォーム As New 子フォーム Label1.Text = 親フォーム.ListBox1.SelectIndex としたのですが, 親フォームでListBox1に0以外のリストを選択したのに, 子側に来ると親フォーム.ListBox1.SelectIndexの値が 0になってしまい,親側での選択内容が反映されません。 どうすれば正しく参照できるでしょうか? 教えてください。よろしくお願いします。

  • 子フォームから親フォームへのデータの受け渡し

    いつもお世話になっております。 VB.NETの質問です。 親フォームから子フォームを開き、子フォームで検索した結果を親フォームに返したいです。 はじめはテキストボックスへ表示させており、何の問題もなく出来ていたのですが、 仕様を変更してコンボボックスやラベルのテキストに表示させるようにしたら、子フォームからデータを取れなくなりました。というか表示されなくなりました。子フォームのme.close()する直前の変数の値にはデータが入っているのですが・・・ なんでなんでしょうか? 開発一筋でやられてきた方には、本当に初歩的な質問だと思いますが、 よろしくお願い致します。

  • Access フォームを動的にカスタマイズ

    お世話になります。 Access2010 現在Accessにて、ある情報の登録フォームを作成しております。 登録項目が複数ありフォームが縦長になりそうなので、基本情報の 登録は必須とし、その他の項目はオプションにしたいと思います。 そこで、チェックボックスにチェックが入れられたら、オプションを 登録できるよう登録フォームの高さを長くするのと同時に、オプション 項目も表示させたいのですが。。どのようにすればよいでしょうか。 予めオプション項目が追加されているフォームを作成しておき、 チェックが入れられたら、そっちのフォームにすり替える方法(必須項目が 入力されていたらそれぞれコピー)や、フォームサイズは変えずに チェックが入れられたら「登録」ボタンを「次へ」に変更させ、 次画面でオプション項目を入力させたり・・色々と方法はあるかと 思いますが、上記のようにフォームの長さを変えて、項目(テキストボックスや リストボックス)を追加することは可能でしょうか。 ご教示の程、宜しくお願い致します。

  • 子フォームから親フォーム上のコントロールを操作したい

    VC++.NET(C++/CLI)にてアプリケーションを開発しております。 親フォーム(FormParent)と子フォーム(FormChild)があり 子フォームから親フォーム上にあるtextBox1を操作したいのですがうまくいきません。 親フォームからはFormChild.hをインクルードすることで 親フォームのインスタンスを得て、子フォームを表示させているのですが これに加えて子フォームからFormParent.hをインクルードすると循環参照(と言うのですか?) となる為にエラーになってしまいます。 よろしくお願いします。

  • [C#]別フォームとの連動について

    Visual C# 2008 を使っています。 子フォームのテキストボックスに書かれた内容を、子フォーム上のボタンを押すことで、親フォームのリストボックスに追加する。 といったプログラムを作成しているところです。 しかし、子フォーム上のボタンのクリックイベントハンドラの中に、 親フォームのリストボックスへ内容を追加するプログラムを書くと、「現在のコンテキスト内には存在しません」とエラーが出てきます。 試してみたことは ・子フォームのコントロールをprivateからpublicに変えた ・子フォーム内から親フォームを参照するためのポインタを指定 ・子フォームの定義部に親フォーム参照のためのポインタを指定 です。 誰か解決策を教えていただけないでしょうか? よろしくお願いします。

  • 子フォームの情報を親フォームに利用する

    Visual C++初心者です。visual studio2005を使用しています。 まず親フォームで名前を入力させ、「次へ」を押すと子フォームが出て来ます。 そこで好きな食べ物を入力させて「決定」ボタンを押すと子フォームが閉じ、親フォームのテキストボックスに 「○○さん、こんにちは!好きな食べ物は●●ですね」というメッセージを表示させる・・・というフォームアプリケーションを作りたいのです。 子フォームの表示は分かるのですが、そこで入力させた情報を親フォームに反映させる方法が分かりません。 できれば初心者でも分かる回答をして頂ければ有難く思います。 よろしくお願いします。

  • VB2008で親フォームから子フォームを開いたときの処理で

    VB2008で親フォームから子フォームを開いたときの処理で 質問させて頂きます。 親フォームから子フォームを開いて、 子フォーム画面ロード時に、TreeViewにノードを追加する処理を行おうとするのですが、 ノードの追加ができません。 親フォームから子フォームの呼び出しの部分 Using frmAct As New form2 frmAct.ShowDialog() end using 子フォームLoad処理 Private Sub F_Actresult_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load Call MP_hogeload() ←別のモジュールからサブルーチンを呼び出してノード処理を追加させる。 End Sub 外部サブルーチン Public Sub MP_hogeload() With form2 .trehoge.Nodes.Add("hoge") end with end sub 同じ子フォーム内に記述している場合は問題なく追加できています。 この開き方の場合、別のモジュールでノードを追加させる方法を探しています。 よろしくお願いいたします。

  • Access+VB 子フォームから親フォームを・・・

    親フォームの中にタブを置き、その中にサブフォームを置いています。 子フォーム側から、上記のサブフォームの追加許可を「はい」にしたいのですが、どのように記述したらよろしいのでしょうか? Forms("親フォーム名").[サブフォーム名].AllowAdditions = True  これで通りませんでした。 教えて下さい。

専門家に質問してみよう