WPF: SelectedItem aus DataGrid auslesen
Wie wertet man eine Spalte in einem WPF DataGrid.SelectedItem aus?
Aufgabe:
Ich möchte den wert einer Spalte auslesen aus einem Datengrid in WPF. Leider ergibt die Auswertung von DataGrid.SelectedItem eine Zeile vom Type <Anonymus Type> und wenn man die Row umwandelt in von DataGrid.SelectedItem in DataRowView dann wird als Ergebnis immer null zurückgegeben oder die Convertierung von Anonymous Type in DataRowView ist nicht möglich
Problem Umwandlung SelectedItem
DataRowView row = ctlDataGrid.SelectedItem as DataRowView; ->returns null
|
Lösung:
Super Lösung mit C# dynamic.
Man kann den Laufzeit Datentyp dynamic verwenden. Dieser Datentyp dynamic kann zur Laufzeit frei verwendet werden wie var variant und man kann einfach die Spalten oder Felder wie eine Eigenschaft abfragen.
Also einfach Umwandlung von SelectedItem in dynamic und dann die Spalte als dynamic.Spalte auswerten. Das ist einfacher als ein Array oder List vom Type String zu bilden.
dynamic row = ctlDataGrid.SelectedItem; sName = row.Nachname; |
Auszug : Debug
Der Debug Auszug ergibt, dass sich in der DataGrid SelectedItem ein Array aus Strings zur Laufzeit ergibt.
Die SelectedItem ist von Type <Anonymous Type>
Name |
|
Value |
Type |
|
◢ |
ctlDataGrid.SelectedItem |
|
{ Nachname = "Butzer", Maschine = "Drehbank 1", Schichtgruppe = "Schicht 2" } |
<Anonymous Type> |
Code-Beispiel zu Auswerten des ausgewählten Elements in einem WPF DataGrid Selected Item
Private void CtlDataGrid_SelectionChanged(object sender, SelectionChangedEventArgs e) { //----------< CtlDataGrid_SelectionChanged() >---------- string sName = ""; //--< get_DataGrid_SelectedItem >-- //* get DataGrid.SelectedItem as <Anonymus Type > into c#.dynamic //* get Value of dynamic variable simply bei get as named property like dynamic_value.Field if (ctlDataGrid.SelectedItem != null) { dynamic row = ctlDataGrid.SelectedItem; sName = row.Nachname; } //--</ get_DataGrid_SelectedItem >--
//< insert button > Button btn = new Button(); btn.Background = new SolidColorBrush(Colors.Red); btn.Content = sName; //#todo: Event drag drop einfügen
_srcPanel.Child = btn; //</ insert button >
this.Close(); //----------</ CtlDataGrid_SelectionChanged() >---------- }
|