删除多个数据表行后仅触发一个事件
本文关键字:一个 事件 数据表 删除 | 更新日期: 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
:
- 使用交互性处理
'Delete' keydown event and bind it to the Command on viewmodel
。 - 将
DataGrid
的SelectedItems
属性绑定到删除命令的CommandParameter
。 - 在
DeleteCommand handler, remove the items from the DataGrid's ItemsSource.
- 删除项目后,您可以运行检查