细胞价值变化事件,c#

时间:2010-09-29 10:19:06

标签: c# winforms datagridview

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

Amount=Qty*rate

它正在发生,但是当我点击任何其他单元格时,我希望当我在Rate中输入任何值时,它应该与Quantity相乘并立即反映在Amount中而不更改单元格。

3 个答案:

答案 0 :(得分:5)

正如Sachin Shanbhag所提到的,你应该同时使用DataGridView.CurrentCellDirtyStateChangedDataGridView.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论坛时找到的代码:

http://social.msdn.microsoft.com/Forums/windows/en-US/a56ac5c1-e71f-4a12-bbfa-ab8fc7b36f1c/datagridview-text-changed?forum=winformsdatacontrols

我也在这里添加代码:

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事件更容易实现。