Entwickler-Ecke

WPF / Silverlight - WPF DataGrid - Datensatzauswahl


Megatrash - Mo 30.03.15 15:42
Titel: WPF DataGrid - Datensatzauswahl
Ich möchte in einem DataGrid die nicht zugewiesenen Datensätze und in einem weiteren DataGrid die bereits zugewiesenen Datensätze anzeigen. Dazu habe ich eine DataTable mit zwei unterschiedlichen DataViews verwendet. Diese Views habe ich an das jeweilige DataGrid gebunden.

Wenn ich nun einen Datensatz auswähle, soll dieser aus dem ersten DataGrid verschwinden und in dem zweiten angezeigt werden. Das soll auch mit mehreren Datensätzen gleichzeitig funktionieren.


C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
DataView v1 = new DataView(ds.Documents);
DataView v2 = new DataView(ds.Documents);

v1.RowFilter = "Selected = False";
v2.RowFilter = "Selected = True";

da.Fill(ds.Documents);
myGrid01.ItemsSource = v1;
myGrid02.ItemsSource = v2;

private void Grand(object Sender, RoutedEventArgs e)
{
  int Count = myGrid01.SelectedItems.Count;
  if (Count > 0)
  {
    foreach (DataRowView rc in myGrid01.SelectedItems)
      {
        rv.Row.SetField(4,true);
      }
  }
}


Leider funktioniert dies nicht. Es wird eine Ausnahme des Types "System.InvalidOperationException" ausgelöst. Die Auflistung wurde geändert. Der Enumerationsvorgang kann möglicherweise nicht ausgeführt werden.

Hat jemand eine Idee, wie ich diese Funktion umsetzen kann?


Ralf Jansen - Mo 30.03.15 17:19

Man darf während des Iterierens über eine Liste (z.B. dein myGrid01.SelectedItems) nicht die Liste ändern(Elemente in der Liste ja aber nicht die Liste selbst).
Ich vermute mal Column 4 entspricht selected. Durch ändern von selected fällt die betroffene Row aus dem Filter wodurch sie auch zwangsweise aus myGrid01.SelectedItems fällt und das mißfällt dem System da wie gesagt man während einem foreach nicht die Liste ändern darf über die man iteriert.

Entweder keinen foreach verwenden sondern einen anderen Schleifenkonstrukt (z.B. for) oder nicht direkt über diese Liste iterieren sondern einer Kopie davon (z.b. wenn man auf SelectedItems noch ein ToList() aufruft, wenn möglich).


Megatrash - Mo 30.03.15 20:13

Ja, das hört sich plausibel an. Wenn ich z. B. eine andere Spalte ändere, die nicht Bestandteil des Filters ist, funktioniert die Anpassung.

Danke.