2014-05-06 3 views
1

Je l'objet POCO suivant:C1FlexGrid - Comment mettre à jour la grille de BindingSource lorsque changements sous-jacents IEnumerable valeurs

internal class StationEntity : INotifyPropertyChanged 
{ 
    private int _id; 
    private string _stationType; 
    private string _stationName; 

    [Obfuscation(Exclude = true)] 
    public int ID 
    { 
     get { return _id; } 
     set 
     { 
      if (value == _id) return; 
      _id = value; 
      OnPropertyChanged("ID"); 
     } 
    } 

    [Obfuscation(Exclude = true)] 
    public string StationType 
    { 
     get { return _stationType; } 
     set 
     { 
      if (value == _stationType) return; 
      _stationType = value; 
      OnPropertyChanged("StationType"); 
     } 
    } 

    [Obfuscation(Exclude = true)] 
    public string StationName 
    { 
     get { return _stationName; } 
     set 
     { 
      if (value == _stationName) return; 
      _stationName = value; 
      OnPropertyChanged("StationName"); 
     } 
    } 

    public event PropertyChangedEventHandler PropertyChanged; 

    [NotifyPropertyChangedInvocator] 
    protected virtual void OnPropertyChanged(string propertyName) 
    { 
     PropertyChangedEventHandler handler = PropertyChanged; 
     if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName)); 
    } 
} 

Je mis la source de données de la grille comme BindingSource et de définir la source de liaison comme suit:

  gridStations.AutoGenerateColumns = false; 
      stationEntityBindingSource.DataSource = _stations; 
      gridStations.DataSource = stationEntityBindingSource; 

Notez que _stations est un List<StationEntity>. Si je me lie directement à _stations, la grille ne déclenchera pas d'événements de suppression, mais elle le fait lorsque j'utilise BindingSource. Dans mes RENUMBER je supprime la collection:

 private void gridStations_BeforeDeleteRow(object sender, C1.Win.C1FlexGrid.RowColEventArgs e) 
    { 
     if (e.Row < 0 || e.Row > _stations.Count) 
     { 
      e.Cancel = true; 
      return; 
     } 

     var row = gridStations.Rows[e.Row]; 
     if (row.DataSource != null) 
     { 
      var _toDelete = row.DataSource as StationEntity; 
     } 
    } 

    private void gridStations_AfterDeleteRow(object sender, C1.Win.C1FlexGrid.RowColEventArgs e) 
    { 
     if (_toDelete.IsNotNull()) 
     { 
      _stations.Remove(_toDelete); 

      var station = 1; 

      foreach (var item in _stations) 
      { 
       item.ID = station++; 
      } 

      stationEntityBindingSource.DataSource = null; 
      gridStations.Update(); 
      stationEntityBindingSource.DataSource = _stations; 
      gridStations.Update(); 

      _toDelete = null; 
     } 
    } 

Même après avoir terminé la DataSource du BindingSource et réappliquer, la grille ne montre pas encore les valeurs mises à jour. Qu'est-ce que je fais mal?

+0

vous devez notifier la collection modifiée pour écouter ajouter des événements de suppression. la propriété modifiée ne se déclenche que lorsque la valeur change. –

+1

Garçon est-ce que je me sens stupide. La ligne dans BeforeDelete qui affecte _toDelete utilise une déclaration de variable locale qui empêche la définition de la variable d'instance _toDelete. Après avoir déterminé que le code fonctionne bien avec la suggestion dans la réponse. –

+0

@PaytonByrd S'il vous plaît poster votre réponse révisée ici –

Répondre

1
if (_toDelete.IsNotNull()) 
     { 
      _stations.Remove(_toDelete); 

      var station = 1; 

      foreach (var item in _stations) 
      { 
       item.ID = station++; 
      } 

      stationEntityBindingSource.DataSource = null; 
      gridStations.Update(); 
      stationEntityBindingSource.DataSource = _stations; 

      //add this line 
      gridStations.DataSource = null; 
      gridStations.DataSource = stationEntityBindingSource; 

      _toDelete = null; 
     } 
+0

Aucune différence. :( –

+0

Vérifie si '_stations.Remove (_toDelete);' a effectivement supprimé l'élément? –

+0

Oui, la suppression fonctionne, c'est la renumérotation qui ne reflète pas dans la grille –

Questions connexes