我正在使用以下代码将单元格更改提交到数据库并计算数据库中另一个单元格的值。虽然我意识到存储计算值不是常态,但我无法找到在数据库级别计算单元格的方法。
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 整个表格适配器?
我还没有找到适合这个问题的解决方案。有人有推荐吗?我开始理解的是,当它执行 .Fill 时,它会清除表格,然后重新生成解释奇怪焦点行为的行。我开始认为我应该取消绑定datagridview,并手动将数据读取和写入数据库。我真的希望避免这种情况。
比X!