2010-06-30 49 views
3

我有一個DTO的BindingList,它可以直接綁定到窗體窗體控件,並且當用戶想要刪除我的datagridview中的一行時引發問題。DTO的BindingList支持對象刪除狀態

在這種情況下,刪除的對象(行)消失,當DTO BindingList返回服務器進行更新時,我不知道要刪除哪一行。

BindingList默認情況下是否可以爲已刪除的對象創建一個集合,或者我必須手動實現它,或者對於我的情況還有另一個選項?

任何幫助,將不勝感激。

回答

1

BindingList有列表更改時引發的ListChanged事件。您需要編寫處理此事件的代碼並跟蹤列表中的哪些項目已被刪除。

http://msdn.microsoft.com/en-us/library/ms132742.aspx

另一種選擇是,因爲他們在DataGridView發生跟蹤刪除。

+0

嗨沃爾特,非常感謝您的快速回復。 ListChanged事件在對象從列表中移除後觸發,因此我無法在此處獲取對已刪除項目的引用。 我可以在我的BindingList中有一個列表,它保留所有的原始項目並從那裏獲取已刪除的項目,但我認爲這不是一個好主意。 跟蹤從DataGridView的刪除不是我的選擇,因爲我建立一個服務,爲我的客戶提供DTO對象,所以我無法控制在客戶端發生的事情。 您對此有任何其他想法嗎? – TheMy 2010-06-30 10:30:35

+0

@TheMy - 您的綁定列表是繼承BindingList(即MyObjectList:BindingList)的自定義類嗎?還是它是MyObject的BindingList? – Walter 2010-06-30 15:16:03

+0

嗨沃爾特,我的BindList是一個自定義的類,它繼承自BindingList,它作爲我的自定義對象的BindingList,下面是我的類的聲明: public class DataList :BindingList 其中T:DataTransferBase – TheMy 2010-07-01 03:17:14

0

在我看來,用LinQ手動獲取數據。 創建結果的DataTable像

DataTable dt = new DataTable(); 

     dt.Columns.Add("Want to Delete?",typeof(bool)); 
     dt.Columns.Add("Data Id", typeof(string)); 
     dt.Columns.Add("Data 1", typeof(string)); 
     dt.AcceptChanges(); 

     return dt; 

那麼你的結果一樣創建行。

在一個循環中的foreach(VAR結果myResult)

object[] row = new object[] 
     { 
     false, 
     result.Id, 
     result.Data1 
     }; 
     dt.Rows.Add(row); 

讓用戶可以選擇行進行刪除,用戶可以檢查第一列。因爲它是布爾(複選框) 和刪除按鈕點擊事件發生後,拉手選擇的行

foreach (DataRow dr in yourDataTable.Rows) 
     { 
      if (Convert.ToBoolean(dr[0])) // goes in if its checked 
      { 
       // delete dr[0] 
      } 
     } 

我希望這會幫助你。

+0

嗨Serkan,我需要在1次傳輸中將更改應用到數據庫,您的解決方案可以很好地處理一個簡單的對象,但我擔心它無法與更復雜的對象(具有子關係的對象...),子對象首先得到更新,當用戶想要取消主對象的編輯時,被刪除的子對象不能被恢復。謝謝。 – TheMy 2010-06-30 10:20:12