Autor Beitrag
ArminF
Hält's aus hier
Beiträge: 9



BeitragVerfasst: Mi 29.07.09 08:11 
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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3803
Erhaltene Danke: 176

Arch Linux
Python, C, C++ (vim)
BeitragVerfasst: 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:
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
class PersonSelected
{
  Person Entity { get; set; } // ohne O/RM dann eben eine DataRow
  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 Threadstarter
Hält's aus hier
Beiträge: 9



BeitragVerfasst: 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:

ausblenden 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 user profile iconChristian S.: C#-Tags hinzugefügt
Kha
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3803
Erhaltene Danke: 176

Arch Linux
Python, C, C++ (vim)
BeitragVerfasst: Mi 29.07.09 12:20 
Ok, das dynamische Erzeugen der Columns wird in XAML nicht funktionieren (mit etwas Aufwand schon, 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:
ausblenden 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
ausblenden 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:
ausblenden C#-Quelltext
1:
lsv.ItemsSource = myList;					

Dann musst du nur noch diese Zeile anpassen:
ausblenden C#-Quelltext
1:
        gvc.DisplayMemberBinding = new Binding("Row." + c.ColumnName);					

_________________
>λ=
ArminF Threadstarter
Hält's aus hier
Beiträge: 9



BeitragVerfasst: 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 Threadstarter
Hält's aus hier
Beiträge: 9



BeitragVerfasst: Do 06.08.09 09:22 
Also ich habs jetzt ohne Checkboxen gelöst.

Arbeite mit SelectedItems, dann funktionierts auch.