DataGridViewについて
Fom1のDataGridViewから選択した行のデータをForm2のDataGridViewに渡し、Form2で編集しFom1に反映せると、どの行のデータも1行目に入ってしまいます。
どのようなコードで解決できますか?
【Form1】
private void DataGridView1_SelectedRowsDoubleClick(Object sender, MouseEventArgs e)
{
// Form2を作成し、親フォームとしてForm1を設定する
Form2 f2 = new Form2();
f2.Owner = this; // 親フォームを設定
// 選択行のデータを渡す
f2.SetRowData(dataGridView1.SelectedRows, dataGridView1);
// Form2を表示する
f2.Show();
}
/// <summary>
/// 選択行のデータを更新するメソッド
public void UpdateSelectedRowData(int rowIndex, string editedData1, string editedData2, string editedData3)
{
// データソースが DataTable の場合のみ処理を実行する
if (dataGridView1.DataSource is DataTable dt && dt.Rows.Count > rowIndex)
{
// データ行を取得する
DataRow dataRow = dt.Rows[rowIndex];
// 編集データを新しいデータ行にセットする
dataRow["date"] = editedData1;
dataRow["name"] = editedData2;
dataRow["week"] = editedData3;
}
}
}
}
【Form2】
public void SetRowData(DataGridViewSelectedRowCollection rows, DataGridView dataGridView)
{
//データテーブルの作成
DataTable dt = createData();
foreach (DataGridViewRow r in rows)
{
//1列目~3列目を取り出す
string s1 = r.Cells[1].Value.ToString(); // 日付
string s2 = r.Cells[2].Value.ToString(); // 名前
string s3 = r.Cells[3].Value.ToString(); // 曜日
dt.Rows.Add("2023年", s1, s2, s3);
//日付順に昇順に表示する
dt.DefaultView.Sort = "日付 ASC";
}
//一覧を表示する
dataGridViewDisp2(dt);
}
// 編集後のデータを保持するためのプロパティ
public string EditedData1 { get; set; }
public string EditedData2 { get; set; }
public string EditedData3 { get; set; }
/// 更新ボタンの処理
private void savebtn_Click(object sender, EventArgs e)
{
// 親フォーム Form1 をForm1に指定する
Form1 form1 = this.Owner as Form1;
if (form1 != null)
{
// Form1のDataGridViewのデータソースを取得する
DataTable dt = form1.dataGridView1.DataSource as DataTable;
if (dt != null)
{
// dataGridView2の各行を処理する
foreach (DataGridViewRow row in dataGridView2.Rows)
{
// 新規行はスキップする
if (row.IsNewRow)
continue;
// 編集されたデータを取得する
string editedData1 = row.Cells[1].Value.ToString();
string editedData2 = row.Cells[2].Value.ToString();
string editedData3 = row.Cells[3].Value.ToString();
// 選択された行のインデックスを取得する
int rowIndex = row.Index;
// 親フォーム Form1 の UpdateSelectedRowData メソッドを呼び出す
form1.UpdateSelectedRowData(rowIndex, editedData1, editedData2, editedData3);
}
}
}
// 現在のフォームを閉じる
this.Close();
}
}
}