Entwickler-Ecke
WPF / Silverlight - Checkbox zu Gridview im Codebehind hinzufügen
ArminF - Mi 29.07.09 08:11
Titel: Checkbox zu Gridview im Codebehind hinzufügen
Hallo zusammen,
hab grad in meiner Listview einen Gridview, den ich mit Daten aus einer Stored Procedure im Code-Behind-Teil fülle.
Nun bräucht ich noch eine weitere Spalte, in der für jede Zeile eine Checkbox eingefügt wird, um Zeilen aus dem Gridview zu aktivieren.
Dazu hab ich 2 Fragen:
1. Wie krieg ich die Checkboxen im Codebehind in den Gridview, GridViewRow gibts in WPF anscheinend nicht?
2. Wie ist denn die einfachste Möglichkeit, zu prüfen, welche Zeilen er ausgewählt hat?
Hoffe mir kann da jemand ein bisschen weiter helfen.
Armin
Kha - Mi 29.07.09 11:06
:welcome:
Kann es sein, dass du noch ein wenig im Winforms-Mindset steckst ;) ? In WPF sind Controls rein zur Darstellung da. Diese zusätzlichen Daten kannst du nicht im Control selbst speichern, also würde ich jede Entity in einer Klasse wie dieser wrappen:
C#-Quelltext
1: 2: 3: 4: 5:
| class PersonSelected { Person Entity { get; set; } bool IsSelected { get; set; } } |
Eine List<PersonSelected> nimmst du dann als ListView.ItemsSource und fügst im XAML noch eine GridViewColumn für IsSelected mit entsprechendem CellTemplate hinzu (alle anderen Columns von "Name" nach "Entity.Name" usw. ändern).
Das Auslesen wird so zum Kinderspiel: Du gehst durch die List<PersonSelected> und schaust, wo IsSelected true ist.
ArminF - Mi 29.07.09 11:51
Naja also ich bin eigentlich Neueinsteiger und hab bis jetzt nur Java gemacht.
Mein Chef (kommt aus der WinForms-Ecke) hat so eine Art Workbench entwickelt, und die soll ich nun hernehmen für ein neues Projekt.
Da hat er eben die ganzen Listviews im Codebehind über StoredProcedures gefüllt:
Beispiel, wie wir die Listview füllen:
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19:
| DataSet ds = (DataSet)FetchDBdata("p_get_additionalagreement", 0); DataTable dt = ds.Tables["REQUEST"];
GridView grvLabelData = new GridView(); GridViewColumn gvc; grvLabelData.AllowsColumnReorder = true; foreach (DataColumn c in dt.Columns) { gvc = new GridViewColumn(); gvc.DisplayMemberBinding = new Binding(c.ColumnName); gvc.Width = (c.ColumnName.Length * 12); gvc.Header = c.ColumnName; grvLabelData.Columns.Add(gvc); } lsvAdditionalAgreement.View = grvLabelData; lsvAdditionalAgreement.DataContext = dt; Binding bind = new Binding(); bind.BindsDirectlyToSource = true; lsvAdditionalAgreement.SetBinding(ListView.ItemsSourceProperty, bind); |
Könnte man das über Xaml dann auch lösen? oder wie läuft in wpf?
Moderiert von
Christian S.: C#-Tags hinzugefügt
Kha - Mi 29.07.09 12:20
Ok, das dynamische Erzeugen der Columns wird in XAML nicht funktionieren (mit etwas Aufwand
schon [
http://c-sharp-forum.de/topic_ListView+GridViewColumns+dynamisch+binden_90479.html], aber das muss vielleicht nicht jetzt schon sein ;) ...). Ich würde trotzdem so viel wie möglich in XAML deklarieren, also GridView und die Selected-Column:
XML-Daten
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14:
| <ListView.View> <GridView x:Name="gridView" AllowsColumnReorder="True"> <GridView.Columns> <GridViewColumn Header="Ausgewählt"> <GridViewColumn.CellTemplate> <DataTemplate> <CheckBox IsChecked="{Binding IsSelected}" /> </DataTemplate> </GridViewColumn.CellTemplate> </GridViewColumn> </GridView.Columns> </GridView>
</ListView.View> |
Wenn die Spalte hinten stehen soll, musst du statt Columns.Add eben Insert benutzen.
In einer foreach-Schleife wrappst du dann alle DataRows in einer
C#-Quelltext
1: 2: 3: 4: 5:
| class DataRowSelected { public DataRow Row { get; set; } public bool IsSelected { get; set; } } |
und speicherst sie in einer List<DataRowSelected>. Die letzten vier Zeilen deines Quellcodes sind zwar, äh... kreativ :zwinker:, aber das reicht vollkommen:
C#-Quelltext
1:
| lsv.ItemsSource = myList; |
Dann musst du nur noch diese Zeile anpassen:
C#-Quelltext
1:
| gvc.DisplayMemberBinding = new Binding("Row." + c.ColumnName); |
ArminF - Mi 29.07.09 13:51
Okay, langsam wird's immer verständlicher.
Das heisst ich hol die Daten aus der Datenbank ins Dataset, binde über ItemsSource die Daten an den Listview und schon passt alles.
Hättest du da evtl. noch ein Beispiel, wie man das Dataset dann mit einbindet?
ArminF - Do 06.08.09 09:22
Also ich habs jetzt ohne Checkboxen gelöst.
Arbeite mit SelectedItems, dann funktionierts auch.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!