- 締切済み
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) { }
- みんなの回答 (2)
- 専門家の回答
みんなの回答
- dell_OK
- ベストアンサー率13% (766/5720)
・Form1で関数を作りその関数をForm2で使いたいのです なるほど。それでしたらこんな感じでどうでしょうか。 Form1 public void Save(DataGridViewRowCollection rows) { foreach (DataGridViewRow r2 in rows) { var index = int.Parse(r2.Cells["Index"].Value.ToString()); var r1 = dataGridView1.Rows[index]; r1.Cells[1].Value = r2.Cells[1].Value; r1.Cells[2].Value = r2.Cells[2].Value; r1.Cells[3].Value = r2.Cells[3].Value; } } Form2 private void savebtn_Click(object sender, EventArgs e) { Form1 f1 = (Form1)Owner; f1.Save(dataGridView1.Rows); } ・System.ArgumentException: 'Index という列は見つかりません。 createData()の中でIndexカラムを追加すれば大丈夫かと思っていたのですが、 以下の行は追加していただけましたか。 dt.Columns.Add("Index");//最後にForm1のRow.Indexを保持するカラムを追加 それはそうと。 環境がわからずに試しているのですが、 .NET Frameworkか.NETか、そのバージョンはなんでしょうか。 実は私の環境では、DataGridViewにSelectedRowsDoubleClickイベントがなくて、 別の方法でForm2を開いているのですが、 SelectedRowsDoubleClickイベントは自作でしょうか。
- dell_OK
- ベストアンサー率13% (766/5720)
「関数を使いたい」と言うのがどのようなことかわからなかったので、ひとまずまるまるコーディングする方法です。 Form1 Form2を開くところは f2.ShowDialog(this); にして、 Form1を操作(変更)できないようダイアログでForm2を開き、 親フォームとしてthis(Form1のこと)を渡すようにしてください。 それと、Form2から直接Form1へ反映させるため、 Form1のdataGridView1 の Modifiersプロパティを True にしておいてください。 Form2 ※createData()とdataGridViewDisp2()はどうなっているのかわからないので適当に書いてます。 ---- 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, r.Index);//Row.Indexを追加 } dataGridViewDisp2(dt); } private DataTable createData() { var dt = new DataTable(); dt.Columns.Add(); dt.Columns.Add(); dt.Columns.Add(); dt.Columns.Add(); dt.Columns.Add("Index");//最後にForm1のRow.Indexを保持するカラムを追加 return dt; } private void dataGridViewDisp2(DataTable dt) { dataGridView1.DataSource = dt; dataGridView1.Columns["Index"].Visible = false;//Indexカラムを非表示 } private void savebtn_Click(object sender, EventArgs e) { Form1 f1 = (Form1)Owner; foreach (DataGridViewRow r2 in dataGridView1.Rows) { var index = int.Parse(r2.Cells["Index"].Value.ToString()); var r1 = f1.dataGridView1.Rows[index]; r1.Cells[1].Value = r2.Cells[1].Value; r1.Cells[2].Value = r2.Cells[2].Value; r1.Cells[3].Value = r2.Cells[3].Value; } } ----
補足
ありがとうございます。Form1で関数を作りその関数をForm2で使いたいのです><わかりにくくすみませんm(__)m >Form1のdataGridView1 の Modifiersプロパティを True にしておいてください。 Modifiersプロパティに Trueは選択も入力もできず、、、今はpublicになってます。 その状態で実行すると 【var index = int.Parse(r2.Cells["Index"].Value.ToString());】の部分で、System.ArgumentException: 'Index という列は見つかりません。 パラメーター名:columnName' というエラーが起きてしまします><
補足
ありがとうございます!!試してみます!! 環境記載漏れすみません(><) .NET Frameworkです! SelectedRowsDoubleClickは自作かもしれないです。ここは上司が教えてくれた通りに書きました。