c#winforms:搜索更改单元格值AND单元格焦点后将触发的datagridview事件

本文关键字:单元格 事件 datagridview AND 搜索 c#winforms 焦点 | 更新日期: 2023-09-27 18:28:51

当且仅当特定单元格的值发生变化且焦点转移到另一个单元格时,我需要执行一些逻辑。只有当值和焦点都发生了变化时,才需要执行逻辑。。。即用户已经完成了对单元格的编辑并正在继续。它不应该仅仅通过更改单元格焦点而关闭。。。仅当值发生更改时。我一直在寻找和尝试事件,但到目前为止都没有成功。

请注意。。。这是一个以编程方式填充的未绑定网格视图。我很想使用传统的绑定网格视图,但这是我必须使用的,因为我们现有的代码是如何编写的。

这就是我尝试过的。。。

DataGridView.CellValidated"在单元格完成验证后发生。"当我更改单元格值时,此项会触发。。。然后每次我改变单元格焦点时,不管我在第一次之后是否真的改变了单元格值。不符合我的需求,因为每当我转移注意力时,它总是被调用。。。即使价值没有变化。

DataGridView.CellValidating当单元格失去输入焦点时发生,从而启用内容验证似乎也不能满足我的需要。

DataGridView.CellValueChanged"在单元格的值更改时发生。"每次我更改值时都会触发。。。在转移焦点之前。对我来说也没用。

我真的不知道我是在使用正确的事件,还是没有在某个地方设置属性,或者没有调用某个方法来更改网格视图的状态。我们将不胜感激。

谢谢,John

c#winforms:搜索更改单元格值AND单元格焦点后将触发的datagridview事件

使用Cellvaliding事件检查值是否已更改或未将其置于全局布尔值并保存当前单元格行索引和列,在SelectionChanged事件上检查值是否更改:如果未更改,请使用DatagridCurrentCell将焦点放在保存索引行和列保存的上

datagridview_CellValidating(object sender, DataGridViewCellValidatingEventArgs e)
{
  if(e.FormattedValue == (theOldValue))
  {
      changed = false; 
      currentIndexRow= e.RowIndex; 
      currentIndexColumn= e.ColumnIndex; 
      e.cancel = true; 
  }
}
datagridview_SelectionChanged(object sender, EventArgs e)
{
   if(!changed)
    datagridview.CurrentCell = datagridview.Rows[currentIndexRow].Cells[currentIndexColumn];
}

使用事件组合
当触发CellValueChanged事件时,设置一个标志,指示该值已更改
然后,当CellLeave事件被触发时,检查标志并相应地执行您的逻辑。。