ListView Scrollposition ändern

  • VB.NET
  • .NET (FX) 4.0

Es gibt 1 Antwort in diesem Thema. Der letzte Beitrag () ist von exc-jdbi.

    ListView Scrollposition ändern

    Guten Morgen Community

    Ich bin an einem umfangreichen Projekt, in dem ich in einem ListView die HScrollposition ändern will.
    Dazu hab ich mir jetzt ein kleines Beispiel (Hab ich mal irgenwo im Internet gefunden) gemacht.

    Die Daten sind per ListOfT bzw. ListViewItems in die lvi.SubItems geaddet.


    Wie auf dem Bild erkennbar ist, möchte ich per Button-Click zur entsprechenden Spalte wechseln.

    Ich hab mittlerweile schon folgenden API'-Funktionen ausprobiert, funkst aber nicht so wie erwünscht.
    GetScrollInfo
    SetScrollInfo
    SendMessage
    SetScrollPos
    GetScrollPos
    WndProc (Möchte ich nicht nutzen, es soll ohne funktionieren)

    Das Problem ist, dass die HScrollbar mit diesen API-Funktionen sich zum Teil massiv ändert (Scrollbar-Eigenschaften), so das am Schluss eine undefinierte Sache entsteht.

    Hat sich jemand schon mal mit dem Problem befasst? Eventuell überseh ich was. Wäre um jeden Tip dankbar.

    WICHTIG: Ich speiche am Schluss alle Werte ab, und beim Neustart soll wieder die entsprechende Position angefahren werden.

    BasisCode

    VB.NET-Quellcode

    1. Option Strict On
    2. Option Explicit On
    3. Imports System.Reflection
    4. Imports Sample.LvScrollInfo
    5. Imports System.Runtime.InteropServices.Marshal
    6. Public Class Form1
    7. Private sortord As SortOrder
    8. Private colIndex As Int32 = -1
    9. Private Sub LvMain_ColumnClick(ByVal sender As Object, ByVal e As ColumnClickEventArgs) Handles lvMain.ColumnClick
    10. Me.ColumnSort(e.Column)
    11. End Sub
    12. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BtnCol1.Click, BtnCol2.Click, BtnCol3.Click, BtnCol4.Click, BtnCol5.Click, BtnCol6.Click, BtnCol7.Click
    13. Select Case DirectCast(sender, Button).Name
    14. Case "BtnCol1" : Stop
    15. Case "BtnCol2" : Stop
    16. Case "BtnCol3" : Stop
    17. Case "BtnCol4" : Stop
    18. Case "BtnCol5" : Stop
    19. Case "BtnCol6" : Stop
    20. Case "BtnCol7" : Stop
    21. End Select
    22. End Sub
    23. Private Sub ColumnSort(ByVal columnindex As Int32)
    24. Dim idx As Int32 = columnindex
    25. If Not idx = colIndex Then
    26. colIndex = idx
    27. sortord = SortOrder.Descending
    28. End If
    29. 'Sortierung umkehren
    30. If Not sortord = SortOrder.Ascending Then
    31. sortord = SortOrder.Ascending
    32. Else : sortord = SortOrder.Descending
    33. End If
    34. Dim typ As Type = GetType(String)
    35. Me.lvMain.ListViewItemSorter = New ListViewItemComparer(idx, typ, sortord)
    36. End Sub
    37. Private Sub InitializeListViewItems()
    38. lvMain.BeginUpdate()
    39. SetListViewBasis()
    40. 'Define new column
    41. lvMain.Columns.Clear()
    42. lvMain.Columns.Add("Property", 10, HorizontalAlignment.Left)
    43. lvMain.Columns.Add("Type", 10, HorizontalAlignment.Left)
    44. lvMain.Columns.Add("Value", 10, HorizontalAlignment.Left)
    45. 'Extra noch ein paar zusätzliche Spalten hinzufügen
    46. lvMain.Columns.Add("Type", 10, HorizontalAlignment.Left)
    47. lvMain.Columns.Add("Value", 10, HorizontalAlignment.Left)
    48. lvMain.Columns.Add("Type", 10, HorizontalAlignment.Left)
    49. lvMain.Columns.Add("Value", 10, HorizontalAlignment.Left)
    50. ' List the properties.
    51. ' Use the class you want to study instead of Form1.
    52. Dim property_value As Object
    53. Dim properties_info As PropertyInfo() = GetType(Form1).GetProperties()
    54. lvMain.Items.Clear()
    55. For i As Integer = 0 To properties_info.Length - 1
    56. With properties_info(i)
    57. If .GetIndexParameters().Length = 0 Then
    58. property_value = .GetValue(Me, Nothing)
    59. If property_value Is Nothing Then
    60. ListViewMakeRow(lvMain, .Name, .PropertyType.ToString, "<Nothing>")
    61. Else : ListViewMakeRow(lvMain, .Name, .PropertyType.ToString, property_value.ToString)
    62. End If
    63. Else : ListViewMakeRow(lvMain, .Name, .PropertyType.ToString, "<array>")
    64. End If
    65. End With
    66. Next
    67. AdjustColumn()
    68. lvMain.EndUpdate()
    69. End Sub
    70. Private Sub SetListViewBasis()
    71. With Me.lvMain
    72. .View = View.Details
    73. .FullRowSelect = True
    74. .HideSelection = False
    75. End With
    76. End Sub
    77. Private Sub AdjustColumn()
    78. For Each ch As ColumnHeader In Me.lvMain.Columns
    79. ch.Width = -2
    80. Next
    81. End Sub
    82. Private Sub ListViewMakeRow(ByRef lvw As ListView, ByVal item_title As String, ByVal ParamArray subitem_titles() As String)
    83. Dim new_item As ListViewItem = lvw.Items.Add(item_title)
    84. new_item.SubItems.AddRange(subitem_titles)
    85. 'Auch die neuen Spalten füllen
    86. new_item.SubItems.AddRange(subitem_titles)
    87. new_item.SubItems.AddRange(subitem_titles)
    88. End Sub
    89. Public Sub New()
    90. MyBase.new()
    91. InitializeComponent()
    92. InitializeListViewItems()
    93. End Sub
    94. End Class


    Freundliche Grüsse

    exc-jdbi

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „exc-jdbi“ ()