Laden...

Wie Änderungen an gefilterter BindingList an die ursprüngliche Collection übergeben?

Erstellt von Siedlerchr vor 12 Jahren Letzter Beitrag vor 12 Jahren 1.116 Views
S
Siedlerchr Themenstarter:in
178 Beiträge seit 2009
vor 12 Jahren
Wie Änderungen an gefilterter BindingList an die ursprüngliche Collection übergeben?

Hallo,

ich habe mal ne Frage bezüglich dem Mitgeben von Änderungen einer Collection an eine Andere.

Ich habe ne Liste von Objekten vom Typ A. Derzeit habe ich es aber so dass ich auf diese Liste eine LINQ Abfrage mache, das ganze in ein BindingList und das als DataSource im DGV angebe.

Die Änderungen werden ja jetzt auch schön in die BindingList übernommen. Meine Frage ist jetzt, wie kriege ich die Änderungen der BindingList am Besten mit der eigentlichen Collection synchronisiert kriege.

Jetzt habe ich mich mal ein bisschen schlau gemacht und gefunden zum einen das ListChanged Ereignis und zum Ändern das INotifyPropertyChanged der Objekte in der Liste. Was mir jetzt nicht so ganz klar ist, wie ich dann die andere Urprungscollection aktualisiere. Wie würde man sowas umsetzen?
Oder gibt es vielleicht nen anderen Ansatz um das zu lösen

C
1.214 Beiträge seit 2006
vor 12 Jahren

Ich hätte eher deine ursprüngliche Liste durch eine andere Liste gekapselt, z.B. eine Filterliste. Diese Filterliste wär dann auch Teil deines ViewModels und du hättest die volle Kontrolle drüber, was passiert und könntest es später leicht erweitern/ändern.

S
Siedlerchr Themenstarter:in
178 Beiträge seit 2009
vor 12 Jahren

Danke erstmal für die schnelle Antwort. Könntest du etwas konkreter werden wie du das genau meinst oder vielleicht mal nen Bsp. Ansatz zeigen?
Ich kann das so noch nicht nachvollziehen wie du das meinst.

C
1.214 Beiträge seit 2006
vor 12 Jahren

Naja, irgendwie so:


class ItemProxyList: IList<TypeA>, IEnumerable<TypeA>
{
  internal ItemProxyList(IEnumerable<TypeA> allItems)
  {
     ...
  }

  IEnumerator<TypeA> GetEnumerator()
  {

  }
}

Von was du jetzt konkret ableitest und wie du das implementierst, hängt von den eigentlichen Anforderungen ab. Aber im Endeffekt würde ich so einen Wrapper um die eigentliche Liste mache und die als BindingSource benutzen. Dann kannst du auf Änderungen wie Löschen/Hinzufügen gleich reagieren und hast auch die Konktrolle darüber, welche Elemente du zurückgibst. Intern kannst du natürlich wieder Linq verwenden.

49.485 Beiträge seit 2005
vor 12 Jahren

Hallo Siedlerchr,

zum Ändern das INotifyPropertyChanged der Objekte in der Liste

ich gehe mal davon aus, dass sich in beiden Listen dieselben Objekte befinden (und keine Kopien). Dann zum Synchronhalten beider Listen INotifyPropertyChanged überhaupt nicht erforderlich.

herbivore

S
Siedlerchr Themenstarter:in
178 Beiträge seit 2009
vor 12 Jahren

Danke erstmal für die Antworten, aber ich glaube ich habe mich evtl ein wenig unklar ausgedrückt:

Ich beutze eine LINQ Abfrage mit select NEW zum Abfragen von Daten aus der eigentlichen Liste. Die kann ich aber nicht als DataSource nehmen, weil ich dann nicht die Daten in der "schönen" Form habe wie hier.
Letzendlich geht es mir nur um die Anzeige, es sind keine weiteren daten die hinzugefügt werden oder so, die Daten die ich Abfrage sind alle in der

   var qry = (from myacc in accList //Ursprungsliste
                       select new AccountHosterView
                       {
                           Hostername = myacc.Hoster.Name, //Hoster ist ein Eigenes Objekt das einem Account objekt zugeordnet wird

                           Username = myacc.Username,
                           Password = myacc.Password,
                          ........

                       }).ToList();

Als Datasource des DGV habe ich dann derzeit eine BindingList vom Typ BindingList<AccountHosterHiew>.
Ichn suche im Prinzip eine Möglichkeit, dass wenn ich im DGV was ändere an der Anzeige, die dahinterliegenden Daten mitgeändert werden.
Denn wenn ich jetzt z.B. was ändere im DGV dann würde die Änderung ja nur in der BindingList statfinden und nicht in der eigentlichen Account Liste.

Wie würd ich sowas hinbekommen oder ist mein ansatz evtl falsch?

C
1.214 Beiträge seit 2006
vor 12 Jahren

Und was ist deine "Ursprungsliste"? Wenn das eine Liste von Objekten X ist, dann kannst du das ursprüngliche Objekt deinem AccountHosterView mitgeben. Sowas in etwa:


class AccoutHosterView
{
  private MyAccount _account;

  public AccountHosterView(MyAccount account)
  {
    _account = account;
  }

  public string Hostername
  {
    get {
     return _account.Hoster.Name;
    }
    set {
      _account.Hoster.Name = value;
    }
  }
}

S
Siedlerchr Themenstarter:in
178 Beiträge seit 2009
vor 12 Jahren

Ja das sieht nach einer relativ guten Lösung aus, das könnte genau das sein was ich brauche..

Danke erstmal für den Tipp.