2013-09-24 58 views
0

我有一個DataTable有許多行,並且DataTable綁定到DataGrid。在通過DataGrid刪除一行或多行後,我需要在重新生成的行上執行特定的,相當複雜的檢查。刪除多個DataTable行後只觸發一個事件

我訂閱了RowDeleted事件,並從那裏調用檢查方法。我的問題是,在通過DataGrid刪除多行時,會爲每一行觸發RowDeleted事件,每次調用檢查方法。由於檢查方法檢查所有剩餘的行及其所有列,這對我的應用程序來說是一個巨大的放緩,也是非常冗餘的。一旦所有選定的行被刪除,運行它就足夠了。

有沒有辦法在刪除任意數量的行後觸發只有一個事件?

+0

我刪除了我的答案,因爲如果您使用的是WPF,也許您應該依賴WPF類型的功能。無論如何,我認爲沒有太多方法比提出的方法更有效率(全局變量用於調節給定事件的調用方式)。 – varocarbas

回答

2

你可以用計時器的幫助下做到這一點。聲明全局計時器並設置其屬性:

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-事件,你這樣做:

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

由於計時器被在RowDeleted事件遍地重新啓動再次,你的更新邏輯只會在最後一個處理程序被觸發後才被調用。

+0

我使用WPF,而不是WinForms,但你的想法很有趣。你可以將它轉換爲WPF嗎? –

+1

這是WPF,它只是使用Forms.Timer對象。編輯我的代碼,而不是使用Timers.Timer對象。 ;) –

+0

我剛試過。 「更新邏輯」使用GUI。結果:'InvalidOperationException:調用線程不能訪問這個對象,因爲一個不同的線程擁有它。' - >好的,這個解決了它:http://stackoverflow.com/questions/10267956/answered-update-mainwindow-on -timer-elapsed-event –

0

我建議您將Checkbox列添加到您的datagridview並提供delete button,並讓用戶只需在每行上選中相關複選框即可刪除單行或多行。

並添加您的邏輯,檢查按鈕的刪除命令內的行的剩餘行。這將確保您的邏輯將在每次刪除時運行一次,無論刪除的行數是多少。

+0

不好意思,但是這個修改'DataGrid'的解決方案與其他複選框和刪除按鈕是不符的。此外,這是關於WPF'DataGrid',而不是WinForms'DataGridView'。感謝您的回覆。 –

0

我會建議你處理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. 刪除項目後,你可以運行你的支票
+0

'DataGrid'只有一個'SelectedItem'屬性。你能舉個例子,如何將它綁定到我的'DataTable'上? –

+0

它確實有它..但作爲一個只讀屬性,綁定到它並不直接,所以你可以發送它們作爲命令參數..更新了答案 – Nitin

+0

對不起,沒有一個工作示例代碼是不夠清楚。 –

相關問題