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 <Anonymous 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 Anonymus 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() >----------
}
|