删除多个数据表行后仅触发一个事件

本文关键字:一个 事件 数据表 删除 | 更新日期: 2023-09-27 18:32:36

我有一个包含许多行的DataTable,并且DataTable绑定到一个DataGrid。通过DataGrid删除一行或多行后,我需要对剩余行运行特定的、相当复杂的检查。

我订阅了RowDeleted事件,并从那里调用检查方法。我的问题是,当通过DataGrid删除多行时,每行都会触发RowDeleted事件,每次都调用检查方法。由于检查方法会检查所有剩余的行及其所有列,因此对我的应用程序来说是一个很大的减慢,也非常多余。删除所有选定行后运行它就足够了。

有没有办法在删除任意数量的行后只触发一个事件?

删除多个数据表行后仅触发一个事件

您可以在计时器的帮助下执行此操作。声明全局计时器并设置其属性:

System.Timers.Timer _delayTimer = new System.Timers.Timer(1000);
_delayTimer.Elapsed += new EventHandler(_delayTimer_Elapsed);
 void _delayTimer_Elapsed(object sender, EventArgs e)
 {
     _delayTimer.Stop();
     Dispatcher.Invoke(new Action(UpdateMethodName)); 
     //or - with passing arguments:
     Dispatcher.Invoke(new Action<string>(UpdateMethodName), new object[]{"argument"});
 }

现在,在 RowDeleted-Event 中,您可以执行以下操作:

_delayTimer.Stop();
_delayTimer.Start();

由于计时器在 RowDeleted-事件中一遍又一遍地重新启动,因此只有在触发最后一个处理程序后才会调用更新逻辑。

我建议您Checkbox列添加到datagridview并提供一个delete button,并让用户仅通过选中每行上的相关复选框来删除单行或多行。

并添加您的逻辑,该逻辑检查按钮删除命令中的剩余行。这将确保您的逻辑每次删除运行一次,无论删除的行数如何。

我建议您像这样处理Delete logic in your ViewModel

  1. 使用交互性处理'Delete' keydown event and bind it to the Command on viewmodel
  2. DataGridSelectedItems 属性绑定到删除命令的CommandParameter
  3. DeleteCommand handler, remove the items from the DataGrid's ItemsSource.
  4. 删除项目后,您可以运行检查