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?
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. –
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. –
@PaytonByrd S'il vous plaît poster votre réponse révisée ici –