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