我有一个DataGridView,其中有3列;数量,费率和金额 DataGridView是可编辑的。当我在Rate Column中输入一个值时,应立即在Amount中更改该值。
Amount=Qty*rate
它正在发生,但是当我点击任何其他单元格时,我希望当我在Rate中输入任何值时,它应该与Quantity相乘并立即反映在Amount中而不更改单元格。
答案 0 :(得分:5)
正如Sachin Shanbhag所提到的,你应该同时使用DataGridView.CurrentCellDirtyStateChanged
和DataGridView.CellValueChanged
个事件。在DataGridView.CurrentCellDirtyStateChanged
中,您应检查用户是否正在修改正确的单元格(在您的情况下为 Rate ),然后执行DataGridView.CommitEdit方法。这是一些代码。
private void YourDGV_CurrentCellDirtyStateChanged(object sender, EventArgs e)
{
if (YourDGV.CurrentCell.ColumnIndex == rateColumnIndex)
{
YourDGV.CommitEdit(DataGridViewDataErrorContexts.Commit);
}
}
private void YourDGV_CellValueChanged(object sender, DataGridViewCellEventArgs e)
{
if (e.ColumnIndex == rateColumnIndex)
{
DataGridViewTextBoxCell cellAmount = YourDGV.Rows[e.RowIndex].Cells[amountColumnIndex];
DataGridViewTextBoxCell cellQty = YourDGV.Rows[e.RowIndex].Cells[qtyColumnIndex];
DataGridViewTextBoxCell cellRate = YourDGV.Rows[e.RowIndex].Cells[rateColumnIndex];
cellAmount.Value = (int)cellQty.Value * (int)cellRate.Value;
}
}
答案 1 :(得分:1)
我发现没有可以正确处理细胞更改值的事件。
您必须将可编辑单元格转换为文本框,然后在其上提供已更改的事件。
这是我在浏览其中一个MSDN论坛时找到的代码:
我也在这里添加代码:
void dataGridView1_EditingControlShowing(object sender, DataGridViewEditingControlShowingEventArgs e)
{
if (dataGridView1.CurrentCell.ColumnIndex == 0)
{
TextBox tb = (TextBox)e.Control;
tb.TextChanged += new EventHandler(tb_TextChanged);
}
}
void tb_TextChanged(object sender, EventArgs
{
MessageBox.Show("changed");
}
答案 2 :(得分:0)
如果你真的想在不更改单元格的情况下更新值(如在运行中那样),则必须处理DataGridView.KeyPress事件并检查正在更新的单元格。
如果这太麻烦了,请使用DataGridView.CellValueChanged事件。它比KeyPress事件更容易实现。