unerwartetes Verhalten beim Selektieren eine DataGridview-Zeile

  • VB.NET

Es gibt 16 Antworten in diesem Thema. Der letzte Beitrag () ist von VB-and-Me.

    unerwartetes Verhalten beim Selektieren eine DataGridview-Zeile

    Guten Tag!
    Ich habe auf einer Form 2 DatagridViews (tblBoxdgv und tblStückdgv). Beide haben in der ersten Spalte Zahlen vom Typ Integer. tblBoxdgv jede Zahl nur jeweils einmal, also 1,2,3,4,5,6,.., tblStückdgb aber ein-oder mehrmals, also 1,1,1,1,1,1,2,2,2,3,4,4,4,4,5,6,6,6...
    Ich möchte nun, dass beim Anclicken einer Zeile im tblStückdgv die Zeile im tblBoxdgv mit der gleichen Ziffer selektiert wird. Das gelingt mit diesem Code auch, allerdings nicht, wenn ich nach dem Starten des Programms einer der Zeilen mit der Ziffer 1 anclicke. Bei allen anderen funktioniert das sehr gut. Habe ich erst einmal eine andere Ziffer 2 - ... angeclickt, wird beim nächsten Mal auch die Ziffer 1 richtig selektiert.
    Im Label1 werden auch beim ersten Click alle Werte richtig angezeigt.

    VB.NET-Quellcode

    1. Private Sub TblStückdgv_CellClick(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewCellEventArgs) Handles TblStückdgv.CellClick
    2. If e.RowIndex > -1 Then
    3. Dim zahl As Integer
    4. TblBoxdgv.SelectionMode = DataGridViewSelectionMode.FullRowSelect
    5. For i = 0 To Me.TblBoxdgv.RowCount - 1
    6. If CInt(TblBoxdgv.Item(0, i).Value) = CInt(TblStückdgv.Item(0, e.RowIndex).Value) Then
    7. zahl = i
    8. TblBoxdgv.CurrentCell = TblBoxdgv.Item(0, zahl)
    9. Exit For
    10. End If
    11. Next
    12. Label1.Text = TblStückdgv.Item(0, e.RowIndex).Value.ToString + ">>" + (TblBoxdgv.Item(0, zahl).Value).ToString + ">" + zahl.ToString
    13. End If
    14. End Sub


    Woran mag das liegen?
    Vielen Dank für Eure Mithilfe!
    Viele Grüße
    el
    sowas geht viel besser im BindingSource_CurrentChanged-Event.
    Also im CurrentChanged der einen BindingSource rufst du die Find-Methode der anneren BS auf und fertig.

    den aktuellen Datensatz holt man mit:

    VB.NET-Quellcode

    1. dim rwStück As tblStückRow = DirectCast(DirectCast(bindingSource.Current, DataRowView).Row, tblStückRow)


    guck dir BindingSource im ObjectBrowser genau an.
    @EdR:

    1. War das so gemeint? Auf das doppelte DirectCast wäre ich wohl nie gekommen. Es klappt hervorragend, aber ich habe weder sender noch e verwendet.

    VB.NET-Quellcode

    1. Private Sub TblStückBindingSource_CurrentChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles TblStückBindingSource.CurrentChanged
    2. Dim rwStück As dsMusik.tblStückRow = DirectCast(DirectCast(TblStückBindingSource.Current, DataRowView).Row, dsMusik.tblStückRow)
    3. TblBoxdgv.CurrentCell = TblBoxdgv(0, TblBoxBindingSource.Find("BoxNr", rwStück.Item(0)))
    4. End Sub


    2. Für den umgekehrten Fall (Auswahl einer Zeile in tblBoxdgv und anzeigen aller Zeilen im tblStückdgv mit gleicher Zahl in Reihe 1) habe ich mir folgenden Code gebastelt, der ohne Fehler arbeitet, aber vermutlich werden einem Programmierer die Haare zu Berge stehen.

    VB.NET-Quellcode

    1. Private Sub TblBoxdgv_CellClick(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewCellEventArgs) Handles TblBoxdgv.CellClick
    2. If e.RowIndex > -1 Then
    3. Dim Liste As New List(Of Integer)
    4. If TblBoxdgv.Item(0, e.RowIndex).Value IsNot DBNull.Value Then 'nicht bei Neueingaben, denn hier ist in der ersten Zelle noch keine Zahl
    5. gv.FirstDisplayedCell = TblTTdgv.Rows(min1).Cells(0)
    6. Liste.Clear()
    7. For Each r As DataGridViewRow In TblStückdgv.Rows
    8. If (TblStückdgv.Item(0, r.Index).Value) IsNot DBNull.Value Then
    9. If CInt(TblStückdgv.Item(0, r.Index).Value) = CInt(TblBoxdgv.Item(0, e.RowIndex).Value) Then
    10. r.Selected = True
    11. Liste.Add(r.Index)
    12. Else
    13. r.Selected = False
    14. End If
    15. End If
    16. Next
    17. Dim min2 As Integer = Liste(0)
    18. For i = 0 To Liste.Count - 1
    19. If Liste(i) < min2 Then
    20. min2 = Liste(i)
    21. End If
    22. Next
    23. TblStückdgv.FirstDisplayedCell = TblStückdgv.Rows(min2).Cells(0)
    24. End If
    25. '' das Gleiche nochmals mit einer for - next Schleife:
    26. 'For i = 0 To TblStückdgv.RowCount - 1
    27. ' If CInt(TblStückdgv.Item(0, i).Value) = CInt(TblBoxdgv.Item(0, e.RowIndex).Value) Then
    28. ' TblStückdgv.Rows(i).Selected = True
    29. ' Else
    30. ' TblStückdgv.Rows(i).Selected = False
    31. ' End If
    32. 'Next
    33. End If
    34. End Sub


    Geht das auch mit der Bindingsource.Find-Methode? Es müssten ja ggfls. hier mehrere Reihen gefunden werden.
    Vielen Dank für deine Gedult!
    el
    war fast so gemeint, nur noch konsequenter weg vom DGV, und die typisierten Properties der typisierten StückRow nutzen:

    VB.NET-Quellcode

    1. Private Sub TblStückBindingSource_CurrentChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles TblStückBindingSource.CurrentChanged
    2. Dim rwStück As dsMusik.tblStückRow = DirectCast(DirectCast(TblStückBindingSource.Current, DataRowView).Row, dsMusik.tblStückRow)
    3. TblBoxBindingSource.Position = TblBoxBindingSource.Find("BoxNr", rwStück.BoxNr)
    4. End Sub


    Jawohl, für dein anneres CodeSample stehen mir die Haare zu Berge. Denn ob dus glaubst oder nicht: Für diesen sog. "Parent-Child-View" ist keine einzige Zeile Code erforderlich. Das stellt man im Designer an den BindingSources ein, und dann funzt das. Gugge "ParentChildView" auf Movie-Tuts, oder DB-Programmierung ohne Datenbank

    xml-Datei ist bei Neustart plötzlich leer

    @EdR

    Hallo EdR!
    Ich bin noch dabei, deine Videos durchzuarbeiten, da stellt sich mir plötzlich ein neues Problem.
    Meine xml.Datei hat mittlerweile 67 KB. Wenn ich nun in meinem Programmcode auch nur eine winzige Kleinigkeit ändere, s.B. die Änderung eines Label.Textes, dann sind meine Datagridviews beim Neustart leer und die XML.Datei ist auf 3 Kb zurückgesetzt. Ich muss dann die xml.Datei aus einer Reservedatei erneuern und das Programm -nochmals ohne den Code zu ändern - starten, dann sind alle Daten wieder da.
    Woran liegt das und wie kann man das vermeiden? (Hätte ich ev. eine neue Anfrage starten sollen?)
    Vielen Dank!
    el
    @EdR
    Ja, das ist sehr komisch:
    Hier der Beginn des Programms:

    VB.NET-Quellcode

    1. Option Strict On
    2. Public Class form1
    3. Public Speicherort, Speicherort2, Pfad As String
    4. Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
    5. Speicherort = Application.StartupPath + "\MeineMusik.xml"
    6. Speicherort2 = Application.StartupPath + "\MeineMusikSave.xml"
    7. Eingeben = False
    8. Löschen = False
    9. LBox.Visible = False
    10. With TblBoxdgv
    11. .AllowUserToAddRows = False
    12. .AllowUserToDeleteRows = False
    13. .ReadOnly = True
    14. .SelectionMode = DataGridViewSelectionMode.FullRowSelect
    15. .MultiSelect = True
    16. TblBoxBindingSource.Sort = "BoxNr Asc"
    17. End With
    18. With TblStückdgv
    19. .AllowUserToAddRows = False
    20. .AllowUserToDeleteRows = False
    21. .ReadOnly = True
    22. .SelectionMode = DataGridViewSelectionMode.FullRowSelect
    23. .MultiSelect = True
    24. TblStückBindingSource.Sort = "BoxNr Asc"
    25. End With
    26. DsMusik.ReadXml(Speicherort)
    27. ' Label1.Text = "Es sind " & CStr(TblStückdgv.Rows.Count) & " Musikstücke gespeichert."
    28. Label1.Text = Speicherort
    29. End Sub


    Ich speichere so ab

    VB.NET-Quellcode

    1. DsMusik.WriteXml(Speicherort)

    und lese so die Daten wieder ein

    VB.NET-Quellcode

    1. DsMusik.ReadXml(Speicherort)

    Die xml-Datei wird auch am gewünschten Ort gespeichert.
    Das hat bisher immer gut geklappt. Nun brauche ich nur im Code eine Leerzeile entfernen oder eine neue Leerzeile hinzufügen. Beim Neustart der Programms sind die Daten weg.
    Ich bin ratlos!
    Viele Grüße
    el

    im Anhang mein Programm

    @EdR
    Ich habe nun den ganzen Ordner als rar-Archiv angehängt. Ich hoffe, das ist richtig so und du kommst an alle notwendigen Dateien.

    Hinweis: Die Orginal-xml-Datei ist MeineMusik.xml; zusätzlich ist noch eine Rettungs-xml-Datei MeineMusiksave.xml dabei. Beim Programmstart sollten die Datagridviews gefüllt werden. Sollten sie leer bleiben, können über >Dateien einlesen - von SaveDatei< die Gridviews gefüllt werden und über <Daten speichern> die Datei MeineMusik.xml wieder neu angelegt werden.

    Vielen Dank einstweilen für deine Bemühungen
    und trotzdem einen schönen Sonntag!
    Viele Grüße
    el
    Dateien

    VB-and-Me schrieb:

    Nun brauche ich nur im Code eine Leerzeile entfernen oder eine neue Leerzeile hinzufügen. Beim Neustart der Programms sind die Daten weg.

    kann ich nicht reproduzieren.
    Es öffnet leer, und wenn man Daten laden aus HauptDatei wählt bleibt es leer, und beim Laden aus SaveDatei füllt es sich.

    Und ob ich da im Code mit Leerzeilen fuhrwerke verändert an diesem Verhalten nix.

    ich glaub ich weiß warum.
    Deine eine Datendatei ist namensgleich wie eine Xml-DAtei, die vom VS generiert wird.
    Tu deine Daten in einen anneren Ordner oder benenne die Datei anners als die Anwendung heißt.

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

    Hallo EdR!
    Das mit den Leerzeilen trat auch erst dann auf, wenn man nach dem Laden über die SaveDatei auch wieder abgespeichert hatte und dann neu starten wollte.
    Aber egal! Du hast ja sofort den Fehler gefunden. Ich habe meine XML-Datei umbenannt, und nun arbeitet das Programm wieder gut.
    Herzlichen Dank für Deine Bemühungen!
    Freundliche Grüße
    el