【问题标题】:c# winforms: searching for datagridview event that will fire after changing cell value AND cell focusc# winforms:搜索在更改单元格值和单元格焦点后将触发的 datagridview 事件
【发布时间】:2014-12-30 06:07:34
【问题描述】:

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

请注意...这是一个以编程方式填充的未绑定网格视图。我本来希望使用传统的绑定网格视图,但由于我们现有代码的编写方式,这是我必须使用的。

这是我尝试过的......

DataGridView.CellValidated “在单元格完成验证后发生。” 当我更改单元格值时会触发...然后每次更改单元格焦点时都会触发,无论我是否在第一次之后实际更改了单元格值。不符合我的需求,因为每当我移动焦点时它都会被调用......即使值没有变化。

DataGridView.CellValidating “当单元格失去输入焦点时发生,启用内容验证。” 似乎也没有做我需要的。

DataGridView.CellValueChanged “当单元格的值更改时发生。” 每次我改变值时都会触发......在转移焦点之前。对我的目的也没有用。

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

谢谢, 约翰

【问题讨论】:

  • 也许有人可以告诉我为什么这个问题被否决了,这样我就不会再犯我在这里犯的任何错误了?

标签: c# winforms events datagridview


【解决方案1】:

使用 Cellvalidating 事件检查值是否已更改,将其放在 globale Boolean 上并保存当前单元格行索引和列,并在 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];
}

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2022-01-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-27
      • 1970-01-01
      相关资源
      最近更新 更多