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
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
Freundliche Grüsse
exc-jdbi
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.
VB.NET-Quellcode
- Option Strict On
- Option Explicit On
- Imports System.Reflection
- Imports Sample.LvScrollInfo
- Imports System.Runtime.InteropServices.Marshal
- Public Class Form1
- Private sortord As SortOrder
- Private colIndex As Int32 = -1
- Private Sub LvMain_ColumnClick(ByVal sender As Object, ByVal e As ColumnClickEventArgs) Handles lvMain.ColumnClick
- Me.ColumnSort(e.Column)
- End Sub
- 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
- Select Case DirectCast(sender, Button).Name
- Case "BtnCol1" : Stop
- Case "BtnCol2" : Stop
- Case "BtnCol3" : Stop
- Case "BtnCol4" : Stop
- Case "BtnCol5" : Stop
- Case "BtnCol6" : Stop
- Case "BtnCol7" : Stop
- End Select
- End Sub
- Private Sub ColumnSort(ByVal columnindex As Int32)
- Dim idx As Int32 = columnindex
- If Not idx = colIndex Then
- colIndex = idx
- sortord = SortOrder.Descending
- End If
- 'Sortierung umkehren
- If Not sortord = SortOrder.Ascending Then
- sortord = SortOrder.Ascending
- Else : sortord = SortOrder.Descending
- End If
- Dim typ As Type = GetType(String)
- Me.lvMain.ListViewItemSorter = New ListViewItemComparer(idx, typ, sortord)
- End Sub
- Private Sub InitializeListViewItems()
- lvMain.BeginUpdate()
- SetListViewBasis()
- 'Define new column
- lvMain.Columns.Clear()
- lvMain.Columns.Add("Property", 10, HorizontalAlignment.Left)
- lvMain.Columns.Add("Type", 10, HorizontalAlignment.Left)
- lvMain.Columns.Add("Value", 10, HorizontalAlignment.Left)
- 'Extra noch ein paar zusätzliche Spalten hinzufügen
- lvMain.Columns.Add("Type", 10, HorizontalAlignment.Left)
- lvMain.Columns.Add("Value", 10, HorizontalAlignment.Left)
- lvMain.Columns.Add("Type", 10, HorizontalAlignment.Left)
- lvMain.Columns.Add("Value", 10, HorizontalAlignment.Left)
- ' List the properties.
- ' Use the class you want to study instead of Form1.
- Dim property_value As Object
- Dim properties_info As PropertyInfo() = GetType(Form1).GetProperties()
- lvMain.Items.Clear()
- For i As Integer = 0 To properties_info.Length - 1
- With properties_info(i)
- If .GetIndexParameters().Length = 0 Then
- property_value = .GetValue(Me, Nothing)
- If property_value Is Nothing Then
- ListViewMakeRow(lvMain, .Name, .PropertyType.ToString, "<Nothing>")
- Else : ListViewMakeRow(lvMain, .Name, .PropertyType.ToString, property_value.ToString)
- End If
- Else : ListViewMakeRow(lvMain, .Name, .PropertyType.ToString, "<array>")
- End If
- End With
- Next
- AdjustColumn()
- lvMain.EndUpdate()
- End Sub
- Private Sub SetListViewBasis()
- With Me.lvMain
- .View = View.Details
- .FullRowSelect = True
- .HideSelection = False
- End With
- End Sub
- Private Sub AdjustColumn()
- For Each ch As ColumnHeader In Me.lvMain.Columns
- ch.Width = -2
- Next
- End Sub
- Private Sub ListViewMakeRow(ByRef lvw As ListView, ByVal item_title As String, ByVal ParamArray subitem_titles() As String)
- Dim new_item As ListViewItem = lvw.Items.Add(item_title)
- new_item.SubItems.AddRange(subitem_titles)
- 'Auch die neuen Spalten füllen
- new_item.SubItems.AddRange(subitem_titles)
- new_item.SubItems.AddRange(subitem_titles)
- End Sub
- Public Sub New()
- MyBase.new()
- InitializeComponent()
- InitializeListViewItems()
- End Sub
- End Class
Freundliche Grüsse
exc-jdbi
Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „exc-jdbi“ ()