次のコードを使用して、セルの変更をデータベースにコミットし、データベース内の別のセルの値を計算しています。計算された値を保存するのが標準ではないことはわかっていますが、データベース レベルでセルを計算する方法を見つけることができませんでした。
private void dgvPlayers_CellValidated(object sender, DataGridViewCellEventArgs e)
{
this.Validate();
.
.
.
playerListBindingSource.EndEdit();
playerListTableAdapter.UpdatePlayerAvg(Convert.ToDecimal(average), Convert.ToDecimal(dgvPlayers.Rows[e.RowIndex].Cells[0].Value));
playerListTableAdapter.Update(dsPlayerTeam.PlayerList);
this.playerListTableAdapter.Fill(this.dsPlayerTeam.PlayerList);
}
}
私が遭遇した問題は、TableAdapter.Fillメソッドがセル フォーカスに予期しない変更を引き起こすことです。フィールドをタブで移動すると、すべてが期待どおりに機能しますが、カーソル キーを使用して行を変更すると、フォーカスは別の列、通常は (常にではありませんが) 最初の列に移動します。
現在のセルの行インデックスと列インデックスを保存し、keydownイベントで押されたキーを保存して、CellValidatedハンドラーの最後に手動でフォーカスを設定できると考えました。私が見つけたのは、おそらくDataGridViewが実際にはコントロールのコレクションであるため、 DataGridViewにアタッチしたkeydownイベントが呼び出されなかったことです。これは私が試したものです:
dgvPlayers.KeyDown += new KeyEventHandler(dgvPlayers_KeyDown);
.
.
.
private void dgvPlayers_KeyDown(object sender, System.Windows.Forms.KeyEventArgs e)
{
DataGridView theGrid = (DataGridView)sender;
dgvPlayersKeyPress = e.KeyCode;
}
キープレスを収集できなかったので、手動でフォーカスを設定することはできませんでした.
ここに他のオプションはありますか?おそらく、tableadapter全体の.Fillではなく、特定のセルのバインドされたデータを更新する方法がありますか?
私はまだこの問題に対する適切な解決策を見つけていません。誰かお勧めはありますか?私が理解するようになったのは、セルが.Fillを実行すると、テーブルがクリアされ、奇妙なフォーカス動作を説明する行が再生成されるということです。私は、datagridview のバインドを解除し、手動でデータベースのデータを読み書きする必要があると考え始めています。私は本当にこれを避けたいと思います。
ありがとうございます