我正在使用以下代码将单元格更改提交到数据库并计算数据库中另一个单元格的值。虽然我意识到存储计算值并不是常态,但我还是找不到在数据库级别计算单元格的方法。
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 的 keydown 事件从未被调用过,因为 DataGridView 实际上是一组控件。这就是我的尝试:
dgvPlayers.KeyDown += new KeyEventHandler(dgvPlayers_KeyDown);
.
.
.
private void dgvPlayers_KeyDown(object sender, System.Windows.Forms.KeyEventArgs e)
{
DataGridView theGrid = (DataGridView)sender;
dgvPlayersKeyPress = e.KeyCode;
}
由于我从未能够收集按键,因此我无法手动设置焦点。
这里还有其他选择吗?也许有一种方法可以刷新特定单元格的绑定数据,而不是.Fill表示整个tableadapter?
我仍然没有找到合适的解决方案来解决这个问题。有人有推荐吗?我所了解的是,当它执行.Fill时,它清除表格,然后重新生成行,这解释了奇怪的焦点行为。我开始认为我应该取消绑定datagridview,并手动读取和写入数据库。我真的更愿意避免这种情况。
THANX!