Wpf Datagrid sortieren

  • VB.NET

Es gibt 11 Antworten in diesem Thema. Der letzte Beitrag () ist von HaTcHeT.

    Wpf Datagrid sortieren

    Hallo,

    ich nutze ein wpf-datagrid, um die Daten eines Dataset darzustellen und Datensätze auszuwählen.
    Um den richtigen Datensatz zu erhalten benötige ich seine Zeilennummer (row).
    Solange ich die columns nicht sortiere, greift selectedindex auch auf den richtigen Datensatz zu.
    Werden die Spalten jedoch nach Spalte sortiert, gibt selectedindex immer noch den Wert der jeweiligen Datagrid-Zeile zurück,
    ich benötige allerdings die richtige Datensatznummer.
    Hat jemand eine Idee, wie man das realisieren kann?

    Klaus

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „KlausBonn“ ()

    naja das war ja nur eine Frage von mir ;)

    ich wollte nur sicherstellen, dass ich dein Problem richtig verstanden habe.
    Bsp.:
    Zeile 1 index 0 text Test1
    Zeile 2 index 1 text Ente1

    Sortierung nach text
    Ist das dann nun:

    Zeile 1 index 0 text Ente1
    Zeile 2 index 1 text Test1
    (index wird neu vergeben)
    oder:

    Zeile 1 index 1 text Ente1
    Zeile 2 index 0 text Test1
    (index bleibt erhalten)

    Das wollte ich damit klarstellen ;)

    lg
    ScheduleLib 0.0.1.0
    Kleine Lib zum Anlaufen von Code zu bestimmten Zeiten
    Hallo fichz,

    danke für deine rasche Antwort. Hier die Beschreibung

    1. Datagrid ohne Sortierung
    Zeile 1 index 0 text Test1
    Zeile 2 index 1 text Ente1

    2. Datagrid nach Sortierung
    Zeile 1 index 0 text Ente1
    Zeile 2 index 1 text Test1

    Der Datensatz "Ente" hat im Dataset die rownummer 1
    Wenn ich sortiere, steht er nun im Datagrid an erster Stelle und der Selectedindex der ersten Zeile hat als Rückgabewert 0.
    Dieser Wert verweist dann auf den Datensatz 0 und das ist der Datensatz "Test".

    Das Anklicken - bzw. die Auswahl mit Selectedindex - der ersten Zeile sollte eben im sortierten DG das Ergebnis 1 bringen, damit ich den Satz "Ente" auch auswählen kann.

    Hier noch einige Zeilen Code zur besseren Verdeutlichung:

    Private Sub Casedbladen() ' wird mit Window1.loaded aufgerufen und füllt das Datagrid

    Dim Con = New OleDbConnection("Provider=Microsoft.Jet.OleDb.4.0;data source=" & aPath & "\databaseA.mdb")
    Dim da As New OleDbDataAdapter _
    ("Select * From case1", Con)
    Dim MyCB As OleDbCommandBuilder = New OleDbCommandBuilder(da)
    Dim MaxRows As Integer
    Con.Open()
    da.Fill(dsc, "case1")
    Con.Close()

    DataGrid1.ItemsSource = dsc.Tables("case1").DefaultView ' Spalten 3-16 werden ausgeblendet
    For i = 3 To 16
    DataGrid1.Columns(i).Visibility = System.Windows.Visibility.Hidden
    Next

    End Sub

    Private Sub DataGrid1_SelectionChanged(ByVal sender As System.Object, ByVal e As System.Windows.Controls.SelectionChangedEventArgs) Handles DataGrid1.SelectionChanged
    If DataGrid1.SelectedIndex > -1 Then
    AllesaufNull()

    Auswahlnummer = DataGrid1.SelectedIndex ' Die Variable Auswahlnummer wurde bereits auf Formebene deklariert

    CanvasOpen.Visibility = Windows.Visibility.Hidden 'Übergeordneter Container wird ausgeblendet

    CaseausDBLaden() ' Diese Sub benötigt die Variable Auswahlnummer
    Daten_zuordnen()
    Zeichnung()
    End If


    End Sub

    Klaus

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „KlausBonn“ ()

    Hast du in der Tabelle (denk ich mal) eine ID hinterlegt?
    Wenn Ja:
    Diese wird ja auch mit ausgelesen (auch wenn die Spalte ausgeblendet wird)
    Zugriff hast du ja auch diese ID trotzdem. Somit könntest du das mit selectedindex ja auf diese spalte verweisen und somit den richtigen Datensatz abfragen.
    ScheduleLib 0.0.1.0
    Kleine Lib zum Anlaufen von Code zu bestimmten Zeiten
    Die erste Spalte hat eine Id, aber wie kann von dieser auf den Datensatz verweisen und wie bekomme ich damit die rownummer?

    Meinst Du etwa so:

    dim selectedrow as Datarow = Datagrid1.Selecteditem.row
    Dim selectedvalue as string = selectedrow(0).tostring()

    Dann bekomme ich als Ergebnis die "richtige" ID

    Nur wie ermittele ich damit die rownummer?

    Klaus

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „KlausBonn“ ()

    für was benötigst du die rownummer genau?
    bzw was macht dein Programm genrell wenn es einen Datensatz ausgewählt hat (oder sollte es machen)

    da du ja die ID hast kannst du ja wieder Abfragen starten etc. darum wäre es intresannt was dein Proggi so tut.

    lg
    ScheduleLib 0.0.1.0
    Kleine Lib zum Anlaufen von Code zu bestimmten Zeiten
    Ich wähle den Datensatz im Datagrid aus.
    Auswahlnummer = xxx
    Dann nutze ich diese Variable (z.B. 2) um auf einen Datensatz in der Datenbank zu verweisen.
    Das geschieht in folgender Sub:
    CaseausDBLaden() ' Diese Sub benötigt die Variable Auswahlnummer
    Diese Sub wird von Datagrid1.Selectionchanged aus aufgerufen (s.o.)
    Die Ladeanweisungen sind recht komplex,
    Es verden aus der db z.B. verschiedene Filestreams geladen.
    Deshalb habe ich diese in einer eigenen Sub platziert.

    Ich benötige die Auswahlnummer, um den richtigen Datensatz in meiner db zu finden.

    Zwischenzeitlich habe ich ein wenig gecodet:

    dim bnd as new forms.bindingsource
    bnd.datasource= dsc.Tables("Case1")
    dim rownr as object =bnd.find("id", selectedvalue)

    Komme ich damit wohl zum Ziel?

    Die Entwicklung meines Programms geht bis in die 90er Jahre zurück, in VB5-6 war ich ziemlich fit.
    Nun habe ich es in wpf portiert, was ja mehr oder weniger einer Neuentwicklung gleichkam.
    wpf ist halt ein eigenes Thema. Wenn es Dich interessiert kann ich Dir gerne einen Link senden.

    Klaus
    Ich wundere mich, dass du eine DataTable überhaupt vernünftig an ein DataGrid gebunden kriegst. Nach meinen Forschungen kann man dem Xaml keine TypInformationen über die DataRows mitgeben, weil Datarow eine eingeschachtelte Klasse innerhalb des Datasets ist.
    Ich rede von typisierten Datasets, untypisierte sollte man eh nie(!) verwenden.

    Wie dem auch sei. Standardmäßig legt man in den Ressourcen eine CollectionViewSource an, und bindet die an die DatenAuflistung (hier: DataTable). Den View bindet man dann an die CollectionView der CollectionViewSource, und dann übernimmt diese das Sortieren.

    Wie gesagt: Erfahrungen habich mit Dataset und wpf keine, jdfs. keine erfolgreichen
    Danke für Deine Hilfe, ich werde mich nochmals melden, wenn ich das Problem gelöst habe.
    Das kann dann auch anderen Leuten im Forum helfen.

    Somit geschehen:

    Zuerst ermittele ich die ID s.o. - Danke für den Tipp

    Dim selectedrow as Datarow = Datagrid1.Selecteditem.row
    Dim selectedvalue as string = selectedrow(0).tostring()

    Diese suche ich dann mit einer for next Schleife in der Tabelle

    dim maxrows as integer = dsc.tables("case1").Rows.count

    for i=0 to maxrows -1
    if (dsc.Tables("Case1").Rows(i).item(0)) = selectedvalue then
    rownr = i
    end if
    next

    und übergebe die rownr an meine Variable Auswahlnummer.

    Die Lösung ist vielleicht nicht elegant aber funktioniert...

    Dir nochmals herzlichen Dank !!!

    Gruß

    Klaus

    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „KlausBonn“ ()

    hier eine elegantere Lösung, um in WPF die Daten aus einem DataGrid trotz Sortierung richtig auszulesen :

    VB.NET-Quellcode

    1. (Dim NewDataGrid As DataGrid = sender) 'sender = Event - Objekt


    VB.NET-Quellcode

    1. Dim ItemSourceView As ListCollectionView = CollectionViewSource.GetDefaultView(NewDataGrid.ItemsSource)
    2. Dim code As String = ItemSourceView(NewDataGrid.SelectedIndex).A.ToString.Trim 'Nummer


    "A" ist dabei das Binding der Spalte an das DataGrid

    mfg