2012-02-20 2 views
0

J'ai un DataGridView et un BindingSource bs rempli bs.DataSource = list;list est un BindingList<Item>.CRUD sur BindingSource dans Winforms

Tout ce que je veux, c'est que chaque Item ait été modifié et que chaque élément supprimé soit notifié qu'il a été supprimé. Ou à la place, j'aimerais avoir accès aux éléments modifiés, nouveaux et supprimés après que l'utilisateur a modifié la grille et appuyé sur le bouton.

Modifier:

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; 
} 

Répondre

1

Youll veulent écouter l'événement ListChanged sur votre BindingList<Item> ou BindingSource bs. Dans le ListChangedEventArgs, le ListChangedType avec ont des détails précis sur ce qui a changé:

Reset - Une grande partie de la liste a changé. Tous les contrôles d'écoute doivent actualiser toutes leurs données de la liste.

ItemAdded - Un élément ajouté à la liste . NewIndex contient l'index de l'élément qui a été ajouté.

ItemDeleted - Un élément supprimé de la liste. NewIndex contient l'index de l'élément qui a été supprimé.

ItemMoved - Un élément déplacé dans la liste. OldIndex contient l'index précédent de l'élément, tandis que NewIndex contient le nouvel index de l'élément.

ItemChanged - Un élément a été modifié dans la liste. NewIndex contient l'index de l'élément qui a été modifié .

J'ai mis en gras ceux que vous avez mentionnés.

Mise à jour

Ok, donc c'est ce que la classe Item devrait ressembler à:

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)); 
     } 
    } 
} 

Ensuite, lorsque vous vous attachez à BindingList vous devriez obtenir les mises à jour. Vous pouvez ensuite modifier l'état de votre article lorsque vous recevez ces événements ou via la liaison de données.

+0

Lorsque l'élément est modifié, cet événement n'est pas déclenché. J'ai besoin de détecter les changements d'attributs des éléments de la liste. – Cartesius00

+0

Quand vous voulez éditer, voulez-vous dire qu'ils changent la valeur dans le DataGridView et puis déconcentrent l'élément actuel, il ne se déclenche pas? Vos éléments de liste devront implémenter INotifyPropertyChanged pour que cela fonctionne. – SwDevMan81

+0

Oui! C'est tout, mais j'ai implémenté cette interface mais rien ne se déclenche, :-(En d'autres termes, mon objet implémente 'INotifyPropertyChanged' mais l'événement PropertyChanged n'est pas déclenché sur" focus-lost ". – Cartesius00