2012-02-20 102 views
0

我有一個DataGridView和一個BindingSource bs填充使用bs.DataSource = list;其中listBindingList<Item>在Winforms中的BindingSource上的CRUD

我只想讓每個更改的Item都通知它已更改,並且每個已刪除的項目都會通知它被刪除。或者,我想在用戶編輯網格並按下按鈕後訪問已更改,新的和已刪除的項目。

編輯

public abstract class Item : INotifyPropertyChanged { ....... 
public Item() 
{ 
    Id = IdCounter++; 
    Pairs = new HashSet<int>(); 
    State = ItemState.NEW; 
    Name = "#noname"; 
    Note = ""; 
    PropertyChanged += new PropertyChangedEventHandler(Item_PropertyChanged); 
} 

void Item_PropertyChanged(object sender, PropertyChangedEventArgs e) 
{ 
    SetChanged(); 
} 

/* nastaví příznak, že se něco změnilo - to následně vyvolá UPDATE (při použití SQL úložiště) */ 
public void SetChanged() 
{ 
    State = ItemState.CHANGED; 
} 

回答

1

剎那間想監聽ListChanged事件對你BindingList<Item>BindingSource bs一個CurrentItemChange事件。在ListChangedEventArgs,ListChangedType具有關於更改內容的具體細節:

重置 - 大部分列表已更改。任何監聽控件都應該從列表中刷新其所有數據。

品種新增 - 一項添加到 列表。 NewIndex包含已添加項目的索引。

ItemDeleted - 從列表中刪除的項目。 NewIndex包含已刪除項目的 索引。

ItemMoved - 在 列表中移動的物品。 OldIndex包含該項目的上一個索引,而 NewIndex包含該項目的新索引。

ItemChanged - 在列表中更改了項目 。 NewIndex包含 已更改的項目的索引。

我粗體顯示了你提到的那些。

更新

好了,所以這是Item類應該是什麼樣子:

public class Item : INotifyPropertyChanged 
{ 
    public event PropertyChangedEventHandler PropertyChanged; 

    private int _Id; 
    private HashSet<int> _Pairs; 
    private ItemState _State; 
    private String _ItemName; 
    private String _Note; 

    public Item() 
    { 
     Id = IdCounter++; 
     Pairs = new HashSet<int>(); 
     State = ItemState.NEW; 
     Name = "#noname"; 
     Note = "";  
    } 

    public int Id 
    { 
     get { return _Id; } 
     set 
     { 
     if(_Id != value) 
     { 
      _Id = value; 
      NotifyPropertyChanged("Id"); 
     } 
     } 
    } 

    ... Implement other properties like above/below 

    // Dont use 'Name' as a property type 
    public String ItemName 
    { 
     get { return _ItemName; } 
     set 
     { 
     if(_ItemName!= value) 
     { 
      _ItemName= value; 
      NotifyPropertyChanged("ItemName"); 
     } 
     } 
    } 

    ... 

    public void NotifyPropertyChanged(String propertyName) 
    { 
     PropertyChangedEventHandler prop_changed = PropertyChanged; 
     if (prop_changed != null) 
     { 
     prop_changed(this, new PropertyChangedEventArgs(propertyName)); 
     } 
    } 
} 

然後,當你連接到你的BindingList你應該得到更新。然後,您可以在收到這些事件或通過數據綁定時更改物品的狀態。

+0

當編輯該項目時,該事件未被觸發。我需要檢測列表項的屬性更改。 – Cartesius00 2012-02-20 21:09:14

+0

當你的意思是編輯,你的意思是他們改變DataGridView中的值,然後忽略當前項目,它不會觸發?您的列表項必須實施INotifyPropertyChanged才能使其工作。 – SwDevMan81 2012-02-20 21:15:50

+0

是的!這就是它,但我已經實現了這個接口,但沒有被觸發,:-(換句話說,我的項目實現了'INotifyPropertyChanged',但PropertyChanged事件沒有在「焦點丟失」事件上被觸發。 – Cartesius00 2012-02-20 21:20:51

相關問題