单元值更改事件,c#

单元值更改事件,c#,c#,winforms,datagridview,C#,Winforms,Datagridview,我有一个DataGridView,其中有3列;数量、费率和金额。 DataGridView是可编辑的。当我在“费率”列中输入一个值时,该值应立即更改金额 Amount=Qty*rate 这种情况正在发生,但当我单击任何其他单元格时,我希望当我在Rate中输入任何值时,该值应与数量相乘,并立即反映在数量中,而无需更改单元格。如果您确实希望在不更改单元格的情况下更新该值(如在运行中),您必须处理该事件并检查正在更新的单元格 如果这是一个太多的麻烦,使用事件。它比按键事件更容易实现。正如Sachin

我有一个DataGridView,其中有3列;数量、费率和金额。
DataGridView是可编辑的。当我在“费率”列中输入一个值时,该值应立即更改金额

Amount=Qty*rate

这种情况正在发生,但当我单击任何其他单元格时,我希望当我在Rate中输入任何值时,该值应与数量相乘,并立即反映在数量中,而无需更改单元格。

如果您确实希望在不更改单元格的情况下更新该值(如在运行中),您必须处理该事件并检查正在更新的单元格


如果这是一个太多的麻烦,使用事件。它比按键事件更容易实现。

正如Sachin Shanbhag所提到的,您应该同时使用
DataGridView.CurrentCellDirtyStateChanged
DataGridView.CellValueChanged
事件。在
DataGridView.CurrentCellDirtyStateChanged
中,您应该检查用户是否修改了正确的单元格(在您的情况下是速率),然后执行方法。下面是一些代码

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;
    }
}

我没有发现任何事件可以正确处理单元格更改的值

必须将可编辑单元格转换为文本框,然后在其上提供已更改的事件

这是我在浏览某个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");
}

你试过什么项目?尝试DataGridView.CurrentCellDirtyStateChanged事件使用CommittedIt,CurrentCellDirtyStateChanged确实可以按预期工作,每次脏状态发生更改(即用户更改字符串)时都会触发它,谢谢Dmitry!