DataGridView und FirstDisplayedScrollingRowIndex

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

Es gibt 4 Antworten in diesem Thema. Der letzte Beitrag () ist von Dideldum.

    DataGridView und FirstDisplayedScrollingRowIndex

    Hi Ihr,

    ich habe:
    dgv_Files.Rows.Count = 145
    dgv_Files.DisplayedRowCount = 45
    Variable found = (z.B.) 144
    dgv_Files.FirstDisplayedScrollingRowIndex = found

    Nun erhalte ich nach der letzten Zuweisung in der dgv_Files.FirstDisplayedScrollingRowIndex aber den Wert 96 anstelle dem erwarteten Wert 99 (found - displayedRowCount).
    So wird aber die gewünschte Zeile 144 nicht im DGV angezeigt, sondern steht 3 Zeilen unterhalb des sichtbaren Bereichs der DGV.

    Sobald ich testhalber dgv_Files.FirstDisplayedScrollingRowIndex aber den Wert 145 zuweise, bekomme ich natürlich den Fehler OutOfRange

    Was mache ich da falsch?
    Bzw. Wie kann ich in der DGV tatsächlich die letzte Zeile anzeigen lassen?

    EDIT: seltsamerweise scheint kein Anderer dieses Problem zu haben, wenn ich nach FirstDisplayedScrollingRowIndex suche...

    EDIT1: Selbst, wenn ich mit

    VB.NET-Quellcode

    1. dgv_Files.FirstDisplayedScrollingRowIndex = dgv_Files.Rows.Count - 1

    scrollen lasse, bleibt die letzte Zeile 4 Zeilen unter dem Horizont der DGV.

    Beste Grüsse

    EDIT2:

    Es muss mit meiner Customize-Layout zusammenhängen

    VB.NET-Quellcode

    1. For Each ctrl As Control In container.Controls
    2. If TypeOf ctrl Is DataGridView Then
    3. Dim dataGridview As DataGridView = DirectCast(ctrl, DataGridView)
    4. dataGridview.Font = schriftart
    5. dataGridview.ForeColor = schriftfarbe
    6. dataGridview.BackColor = Hintergrundfarbe
    7. dataGridview.BackgroundColor = Hintergrundfarbe
    8. dataGridview.DefaultCellStyle.Font = schriftart
    9. dataGridview.DefaultCellStyle.ForeColor = schriftfarbe
    10. dataGridview.DefaultCellStyle.BackColor = Hintergrundfarbe
    11. dataGridview.AlternatingRowsDefaultCellStyle.Font = schriftart
    12. dataGridview.AlternatingRowsDefaultCellStyle.ForeColor = schriftfarbe
    13. dataGridview.AlternatingRowsDefaultCellStyle.BackColor = Hintergrundfarbe
    14. Dim cellStyle As New DataGridViewCellStyle With {
    15. .Font = schriftart,
    16. .ForeColor = schriftfarbe,
    17. .BackColor = Hintergrundfarbe
    18. }
    19. For Each row As DataGridViewRow In dataGridview.Rows
    20. For Each cell As DataGridViewCell In row.Cells
    21. cell.Style = cellStyle
    22. Next
    23. Next
    24. End If
    25. next


    Denn wenn ich in den Settings auf Schriftgrösse 14 einstelle, scrollt die DGV brav auf die letzte Zeile.
    Nicht aber, wenn ich die Schrift auf 10 setze. Dann fehlen dem FirstDisplayedScrollingRowIndex vier Zeilen.
    Habe ich vielleicht weitere erforderliche Font-Einstellungs-Anpassungen der DGV vergessen?

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

    Hallöchen @ErfinderDesRades

    ich habe einen ganz normalen Font-Dialog, in welchem ich Schriftart, -Schnitt und -farbe auswähle.
    Dazu einen Color-Dialog, in dem ich die Hintergrundfarbe auswähle.
    Ich erstelle ja i.d.R. alle Controls im Designer.
    Und bei den Eigenschaften der DGV ist mir aufgefallen, dass im Designer einige Font-Einträge in der folgenden "sub CustomizeListenInForm" per Default leer und andere mit der Schrift "MS-Sans Serif" in 8.75Px ausgefüllt waren.
    Welche der folgend gelisteten Eigenschaften leer waren und welche die MS Sans Serif in 8.5Px hatten habe ich mir leider nicht gemerkt.

    Dann habe ich testhalber alle im folgenden Code bestehenden Font-Eigenschaften im Designer - also die leeren wie auch die vorbefüllten - im Designer auf MS Sans Serif 10Px gesetzt und mein Projekt neu gestartet.
    Und seither passt die Selektion.
    Ich habe den Verdacht, als ob die Eigenschaft "FirstDisplayedScrollingRowIndex" intern aufgrund leerer Default-Fonts-Zuweisungen in den DGV-Eigenschaften die Zeilenhöhe nicht richtig berechnen konnte und daher eben die Position nicht berechnen konnte, wie weit die Rows dafür in der DGV runtergescrollt werden müssen.
    Denn jetzt klappt es mit der Selektion und Anzeige der gesuchten Zeile bei jeder Schriftgrösse, welche ich den Eigenschaften zuweise.

    VB.NET-Quellcode

    1. Public Sub CustomizeListenInForm(container As Control, schriftart As Font, schriftfarbe As Color, Hintergrundfarbe As Color, deaktivierteElemente As Color, Hintergrundbild As String)
    2. For Each ctrl As Control In container.Controls
    3. If TypeOf ctrl Is DataGridView Then
    4. Dim dataGridview As DataGridView = DirectCast(ctrl, DataGridView)
    5. dataGridview.Font = schriftart
    6. dataGridview.ForeColor = schriftfarbe
    7. dataGridview.BackColor = Hintergrundfarbe
    8. dataGridview.BackgroundColor = Hintergrundfarbe
    9. dataGridview.DefaultCellStyle.Font = schriftart
    10. dataGridview.DefaultCellStyle.ForeColor = schriftfarbe
    11. dataGridview.DefaultCellStyle.BackColor = Hintergrundfarbe
    12. dataGridview.AlternatingRowsDefaultCellStyle.Font = schriftart
    13. dataGridview.AlternatingRowsDefaultCellStyle.ForeColor = schriftfarbe
    14. dataGridview.AlternatingRowsDefaultCellStyle.BackColor = Hintergrundfarbe
    15. dataGridview.RowsDefaultCellStyle.Font = schriftart
    16. dataGridview.RowsDefaultCellStyle.ForeColor = schriftfarbe
    17. dataGridview.RowsDefaultCellStyle.BackColor = Hintergrundfarbe
    18. Dim cellStyle As New DataGridViewCellStyle With {
    19. .Font = schriftart,
    20. .ForeColor = schriftfarbe,
    21. .BackColor = Hintergrundfarbe
    22. }
    23. For Each row As DataGridViewRow In dataGridview.Rows
    24. For Each cell As DataGridViewCell In row.Cells
    25. cell.Style = cellStyle
    26. Next
    27. Next
    28. End If
    29. If TypeOf ctrl Is ListBox Then
    30. Dim listbox As ListBox = DirectCast(ctrl, ListBox)
    31. listbox.Font = New Font(schriftart.Name, schriftart.Size, schriftart.Style)
    32. listbox.ForeColor = schriftfarbe
    33. listbox.BackColor = Hintergrundfarbe
    34. End If
    35. If TypeOf ctrl Is System.Windows.Forms.TreeView Then
    36. Dim TreeView As System.Windows.Forms.TreeView = DirectCast(ctrl, System.Windows.Forms.TreeView)
    37. TreeView.Font = New Font(schriftart.Name, schriftart.Size, schriftart.Style)
    38. TreeView.ForeColor = schriftfarbe
    39. TreeView.BackColor = Hintergrundfarbe
    40. End If
    41. If ctrl.HasChildren Then
    42. CustomizeListenInForm(ctrl, schriftart, schriftfarbe, Hintergrundfarbe, deaktivierteElemente, Hintergrundbild)
    43. End If
    44. Next
    45. End Sub


    VB.NET-Quellcode

    1. Private Sub Auswahl_Objekt(Optional name As String = "", Optional nummer As Integer = -1)
    2. Dim vara As Integer
    3. Dim found As Integer = -1
    4. Dim visibleRowsCount = dgv_Files.DisplayedRowCount(False)
    5. Objekt_CryptKey = Daten_Passwort
    6. If dgv_Files.Rows.Count > 0 Then
    7. If name <> "" Then
    8. For vara = 0 To dgv_Files.Rows.Count - 1
    9. If LCase(dgv_Files.Rows(vara).Cells(1).Value.ToString) = LCase(name) Then
    10. found = vara
    11. Exit For
    12. End If
    13. Next
    14. Else
    15. found = nummer
    16. End If
    17. If found = -1 Then
    18. found = 0
    19. Else
    20. If found > dgv_Files.Rows.Count - 1 Then
    21. found = dgv_Files.Rows.Count - 1
    22. End If
    23. End If
    24. If found > -1 Then
    25. dgv_Files.ClearSelection()
    26. dgv_Files.CurrentCell = dgv_Files.Rows(found).Cells(0)
    27. dgv_Files.Rows(found).Selected = True
    28. dgv_Files.FirstDisplayedScrollingRowIndex = found
    29. Objektpfad = AuslesenDateiname(found)
    30. Else
    31. Objektpfad = ""
    32. End If
    33. Else
    34. Objektpfad = ""
    35. End If
    36. End Sub

    Dideldum schrieb:

    Dann habe ich testhalber alle im folgenden Code bestehenden Font-Eigenschaften im Designer - also die leeren wie auch die vorbefüllten - im Designer auf MS Sans Serif 10Px gesetzt und mein Projekt neu gestartet.
    Ich hab dein Problem immer noch nicht nachstellen können, aber bei verschiedenen Fonts im Grid kann ich mir gut vorstellen, dass dann die TopRow-Berechnungen Mist bauen.
    Danke Dir für Deine Hilfe @ErfinderDesRades
    Ich kann das Problem leider nicht mehr nachstellen, da dieses nach den neuen Einstellungsänderungen im Designer gottlob Geschichte ist.
    Es wurde hier im Forum wohl auch deswegen davon abgeraten, benutzerdefinierbare GUI-Schriftarten einzubauen.
    Hatte extrem Aufwand, das ordentlich hinzufummeln. Da wollte so manches nicht so mitspielen, wie ich es wollte.
    Habe das mit den einstellbaren Schriftarten auch nur für einen Kunden gemacht, der extrem schlechte Augen hatte dem musste ich bei 150% Windows-Anzeige auf Schriftgrösse 14 einstellen.
    Der Kunde ist nun verstorben ;( - aber deshalb demontiere ich diese Einstellungen nicht mehr aus meinem Projekt. :D
    Ist halt auch praktisch - wenn ich im Bett liege habe ich in Schlafzimmer-PC die Schriftgrösse meines Projekts auf 14Px (allerdings bei Standard 100% Windows-Anzeige), weil der Bildschirm weit weg ist.
    Ab Arbeitsrechner habe ich die Standard-10Px in meinem Projekt eingestellt.