【问题标题】:Fire only one event after deleting multiple DataTable rows删除多个 DataTable 行后仅触发一个事件
【发布时间】:2013-09-24 08:31:49
【问题描述】:

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

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

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

【问题讨论】:

  • 我已经删除了我的答案,因为如果您使用的是 WPF,也许您应该依赖 WPF 类型的功能。无论如何,我不认为有太多比提议的方法更有效的方法(全局变量来调节给定事件的调用方式)。

标签: c# wpf datagrid datatable rowdeleting


【解决方案1】:

您可以在计时器的帮助下做到这一点。声明一个全局定时器并设置它的属性:

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 事件中一遍又一遍地重新启动,所以您的更新逻辑只会在最后一个处理程序被触发后才会被调用。

【讨论】:

  • 我使用的是 WPF,而不是 WinForms,但你的想法很有趣。你能把它转换成 WPF 吗?
  • 这是 WPF,它只使用 Forms.Timer 对象。编辑了我的代码,而不是它使用 Timers.Timer 对象。 ;)
  • 我刚试过。 “更新逻辑”使用 GUI。结果:InvalidOperationException: The calling thread cannot access this object because a different thread owns it. --> OK,这个解决了:stackoverflow.com/questions/10267956/…
  • 使用 Dispatcher.Invoke 方法从不同的线程调用更新逻辑:msdn.microsoft.com/en-us/library/…
  • 或使用DispatcherTimer
【解决方案2】:

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

并添加您的逻辑来检查按钮的删除命令中的剩余行。这将确保您的逻辑将在每次删除时运行一次,而不管被删除的行数。

【讨论】:

  • 抱歉,但是这个解决方案通过修改 DataGrid 附加复选框和删除按钮是违反要求的。此外,这是关于 WPF DataGrid,而不是 WinForms DataGridView。不过感谢您的回复。
【解决方案3】:

我会建议你处理Delete logic in your ViewModel like:

  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. 删除项目后,您可以运行检查

【讨论】:

  • DataGrid 只有一个SelectedItem 属性。你能举个例子,如何将它绑定到我的DataTable
  • 它确实有它..但由于它是一个只读属性,绑定到它不是直截了当的,所以你可以将它们作为命令参数发送..更新答案
  • 对不起,没有工作示例代码还不够清楚。
猜你喜欢
  • 1970-01-01
  • 2017-10-05
  • 2014-01-02
  • 2012-07-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-18
相关资源
最近更新 更多