何が起こっているのか説明してください。フォームに DataGridView を持つ WinForms .NET アプリケーションを作成しました。DataGridView インライン編集を使用すると、データベースを更新する必要があります。
フォームには、4 つの SqlCommands がバインドされたSqlDataAdapter _da があります。DataGridView は DataTable _names に直接バインドされます。
そのような CellValueChanged ハンドラー:
private void dataGridView1_CellValueChanged(object sender, DataGridViewCellEventArgs e)
{
_da.Update(_names);
}
_names DataTable は更新されますが、データベースの状態は更新されません。_names のすべての行には、RowState == DataRowState.Unchanged があります。
わかりました、ハンドラーを変更しました:
private void dataGridView1_CellValueChanged(object sender, DataGridViewCellEventArgs e)
{
DataRow row = _names.Rows[e.RowIndex];
row.BeginEdit();
row.EndEdit();
_da.Update(_names);
}
このバリアントは実際には変更されたセルをデータベースに書き込みますが、新しい行をグリッドに挿入しようとすると、インデックス e.RowIndex を持つ行がないというエラーが発生します
そこで、ハンドラーをさらに改善することにしました。
private void dataGridView1_CellValueChanged(object sender, DataGridViewCellEventArgs e)
{
if (_names.Rows.Count<e.RowIndex)
{
DataRow row = _names.Rows[e.RowIndex];
row.BeginEdit();
row.EndEdit();
}
else
{
DataRow row = _names.NewRow();
row["NameText"] = dataGridView1["NameText", e.RowIndex].Value;
_names.Rows.Add(row);
}
_da.Update(_names);
}
グリッドに新しい行を挿入すると、本当に奇妙なことが起こります。グリッドは、_names.Rows.Add(row); までの状態のままです。この行の後、3 つの行がテーブルに挿入されます。2 つの行は同じ値で、1 つの行は Null 値です。
わずかに変更されたコード:
DataRow row = _names.NewRow();
row["NameText"] = "--------------"
_names.Rows.Add(row);
3 つの異なる値を持つ 3 つの行を挿入します。1 つはグリッドに入力された値、2 番目は "--------------" 値、3 番目は Null 値です。
私は何が起こっているのかを推測するのに本当に行き詰まりました。