4

何が起こっているのか説明してください。フォームに 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 値です。

私は何が起こっているのかを推測するのに本当に行き詰まりました。

4

3 に答える 3

2

解決策はありますが、何が起こっているのか説明させてください。CellValueChanged イベントがトリガーされるまでに、DataGridView はセルに変更が加えられたことを認識し、実際には既に値をテーブルにプッシュしていますが、テーブルはまだ編集モードであるため、変更された行の RowState は変更されていません。また、挿入された行はまだテーブルに表示されていません。テーブルにこれらの変更を強制的に反映させるには、フォームの BindingContext の EndCurrentEdit() メソッドを呼び出します。

this.BindingContext[_names].EndCurrentEdit();
于 2012-11-24T22:59:44.857 に答える
1

必要な動作を取得する最も簡単な方法 (私が思うに) は、バインディング ソースを導入することです。データ テーブルをそのバインディング ソースのデータ ソースに設定し、バインディング ソースをグリッドに設定します。

変更されたセル値は次のようになります。

private void dataGridView1_CellValueChanged(object sender, DataGridViewCellEventArgs e)
{
    bs.EndEdit();
    _da.Update(_names);
}
于 2012-11-24T23:02:38.657 に答える