Murks mit Sortierung der BindingSource bei Datensuche

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 8 Antworten in diesem Thema. Der letzte Beitrag () ist von ErfinderDesRades.

    Murks mit Sortierung der BindingSource bei Datensuche

    Hallo,

    habe ganz Standard eine DataTable per BindigSource an ein DGV gebunden.

    Man kann das DGV in einer Spalte nach einem bestimmten Eintrag durchsuchen. Das ist realisiert durch Textbox, in welche der Zielwert getippt wird und anschließendem Knopfdruck. Daraufhin wird die Zeile markiert und auf die richtige Höhe gescrollt.

    VB.NET-Quellcode

    1. Private Sub btSuche_Click(sender As Object, e As EventArgs) Handles btSuche.Click
    2. If tbSuche.Text <> "" AndAlso Integer.TryParse(tbSuche.Text, 0) Then
    3. If TabControl1.SelectedTab Is TabPage3 Then
    4. dgv3.ClearSelection()
    5. Dim rowindex As Integer
    6. Dim found As Boolean = False
    7. For Each row As DataSet1.MyTableRow In DS1.MyTable
    8. If row.IDNr = Integer.Parse(tbSuche.Text) Then
    9. rowindex = DS1.MyTable.Rows.IndexOf(row)
    10. found = True
    11. dgv3.Rows(rowindex).Selected = True
    12. dgv3.FirstDisplayedScrollingRowIndex = dgv3.SelectedRows(0).Index
    13. Exit For
    14. End If
    15. Next
    16. If Not found Then
    17. MessageBox.Show("Nr nicht vorhanden")
    18. End If
    19. End If
    20. End If
    21. End Sub


    Wenn ich im DGV aber nun umsortiere per Spaltenkopfclick (Das scheint generell in einem DGV so möglich zu sein, ich habs zumindest nicht reingecodet)
    dann stimmt die gefundene Zeile nicht mehr mit dem was gesucht ist überein.

    Es scheint also zwischen Datenquelle und DGV eine Differenz zu enstehen durch die Sortierung, denn hiermit funktioniert es wieder (Suche im DGV):

    VB.NET-Quellcode

    1. Private Sub btSuche_Click(sender As Object, e As EventArgs) Handles btSuche.Click
    2. If tbSuche.Text <> "" AndAlso Integer.TryParse(tbSuche.Text, 0) Then
    3. If TabControl1.SelectedTab Is TabPage3 Then
    4. dgv3.ClearSelection()
    5. Dim rowindex As Integer
    6. Dim found As Boolean = False
    7. For Each row As DataGridViewRow In dgv3.Rows
    8. If CInt(row.Cells(0).Value) = Integer.Parse(tbSuche.Text) Then
    9. rowindex = row.Index
    10. found = True
    11. dgv3.Rows(rowindex).Selected = True
    12. dgv3.FirstDisplayedScrollingRowIndex = dgv3.SelectedRows(0).Index
    13. Exit For
    14. End If
    15. Next
    16. If Not found Then
    17. MessageBox.Show("Nr nicht vorhanden")
    18. End If
    19. End If
    20. End If
    21. End Sub


    Dies geschah allerdings erst nachdem MyTable für die IDNr-Spalte einen Primärschlüssel hinzugefügt bekam. Als MyTable noch schlüsselfrei war, funktionierte auch die erste Methode.
    Nachtrag: Nicht nur der Primärschlüssel wurde in der DataTable hinzugefügt auch die Befüllung der Tabelle hat sich geändert:

    VB.NET-Quellcode

    1. 'von--------------------------
    2. DS1.MyTable.Clear
    3. ...
    4. DerAdapter.Fill(DS1.MyTable)
    5. 'zu----------------------------
    6. ...
    7. DerAdapter.Fill(DS1.MyTable)

    Also den Clear konnte ich mir sparen, weil der Schlüssel automatisch dafür sorgt, dass die alten EInträgen überschrieben werden.

    Daher zwei Fragen.
    Wieso ändert der Primärschlüssel das Verhalten der ersten Version?
    Und wie sollte man es eigentlich richtig machen?

    Viele Grüße

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

    Bin grad unterwegs, aber ich such nicht das DGV ab, sondern die BindingSource-Inhalte und setze dann das Current neu. Dadurch wird im DGV automatisch die richtige Zeile gewählt. Such mal im Forum nach meiiner typedBindingSource, die hat dafür ne Methode: SetCurrent. Da ist dann auch der Code in dem Thema drin. Ah, hab's: typisierte BindingSource
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.

    Haudruferzappeltnoch schrieb:

    Man kann das DGV in einer Spalte nach einem bestimmten Eintrag durchsuchen. Das ist realisiert...
    ist nicht realisiert.
    Schau deinen Code an: Du durchsuchst eine DataTable im Dataset - nicht das DGV
    Aber wie Vpz sagt: durchsuche besser die BindingSource - das DGV delegiert die Sortierung dahin.
    Achje - im zweiten Snippet durchsuchst du dann ja doch das DGV - und das funzt ja auch.
    Äh - was war nochmal die Frage?
    ah - hier:

    Haudruferzappeltnoch schrieb:

    Und wie sollte man es eigentlich richtig machen?
    durchsuche die BindingSource.

    (die andere Frage - warum der Primärschlüssel das Verhalten der ersten Version ändert, nachdem man ausserdem die Befüllung geändert hat - sorry - das kann ich nicht verifizieren, dass dem überhaupt so ist)
    Jdfs. die Reihenfolge in einer DataTable ist nicht vorgesehen, relevant zu sein. Stell dir die DataTable wie einen Sack vor: Du weisst, dass alles drin ist, was drin sein soll, aber eine Reihenfolge gibts nicht.

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „ErfinderDesRades“ ()

    Ah, das ist schon direkt eingebaut. Ups, dann hab ich es jetz so

    VB.NET-Quellcode

    1. If tbSuche.Text <> "" AndAlso Integer.TryParse(tbSuche.Text, 0) Then
    2. If TabControl1.SelectedTab Is TabPage3 Then
    3. dgv3.ClearSelection()
    4. Dim rowindex As Integer = MyTableBindingSource.Find("IDNr", tbSuche.Text)
    5. If rowindex = -1 Then
    6. MessageBox.Show("IDNr nicht vorhanden")
    7. Else
    8. dgv3.Rows(rowindex).Selected = True
    9. dgv3.FirstDisplayedScrollingRowIndex = dgv3.SelectedRows(0).Index
    10. End If
    11. End If
    12. End If


    Dann sehe ich habe ich noch was durcheinander gebracht. Bezüglich dieser Änderung:

    VB.NET-Quellcode

    1. 'vorher ohne PK
    2. DS1.MyTable.Clear
    3. ...
    4. DerAdapter.Fill(DS1.MyTable)
    5. '------------------------------------------------
    6. 'nachher mit PK
    7. ...
    8. DerAdapter.Fill(DS1.MyTable)


    Da die Table nicht mehr geleert und komplett neu gefüllt wird, sondern nur ein neuer Eintrag erfolgt. Wird in der BindingSource ein solcher neuer Eintrag nun unten angehangen. Vorher war ein neuer Eintrag der erste Wert der Neubefüllung. Das heißt ich sortiere nun nochmal nachträglich mit MyTableBindingSource.Sort = "Datum DESC" nach dem Fill. Oder sollte ich das besser im AddingNew-Event machen, weil dann nicht bei bloßen Änderungen neu sortiert wird? Ist das AddingNew-Event dafür vorgesehen oder lese ich das nur rein?
    Vielleicht ists auch besser den Clear einfach wieder reinzunehmen

    Dieser Beitrag wurde bereits 8 mal editiert, zuletzt von „Haudruferzappeltnoch“ ()

    Vorsicht mit AddNew. Besser ist immer in der Datenquelle Daten einzufügen. Wenn die BS-Datenquelle neu gesetzt werden sollte und nicht mehr auf die DataTable verweist, würde BS.AddNew dazu führen, dass neue Daten zwar angezeigt, aber keine Daten der DataTable hinzugefügt werden.
    Es ist eine Frage Deines Zieles. Die bisherigen Daten sind sortiert. Wenn Daten dazukommen und diese einsortiert werden sollen, ist es richtig, neuzusortieren. Versuch das nicht anders zu erreichen, denn selbst wenn Du Dein Ziel erreichst, Du würdest die Intention dahinter in 4 Wochen nicht mehr verstehen. Ich würd das bei mir durch Methodentrennung verständlich machen, ungefähr so:

    VB.NET-Quellcode

    1. Private Sub AddNewDataAndSortDGV()
    2. AddNewData()
    3. SortDGV()
    4. End Sub

    Dann kannst Du auch an anderen Stellen (Programmstart?) SortDGV aufrufen.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Ja das ist ja das Ding; zu Programmstart ist alles richtig sortiert dank Order By Clause im Sql.

    Später werden nur noch Änderungen oder Neueinträge geladen, weil der PK die gleichen Einträge nicht überschreibt.
    Die sind dann nicht mehr sortiert, weil die unveränderten Daten einfach ihren Platz behalten und das Neue nachrutscht.