Sync 2 list boxes to 1 scrollbar

谁都会走 提交于 2019-12-12 01:22:36

问题


I have 2 listboxes next to each other. One holds the order the other holds the total cost of the order.

For obvious reasons i need both listboxes to scroll simultaneously.

Here is what i have tried

Private Sub lstOrders_Scroll()
    lstTotalsEachOrder.TopIndex = lstOrders.TopIndex
End Sub

Private Sub lstTotalsEachOrder_Scroll()
    lstOrders.TopIndex = lstTotalsEachOrder.TopIndex
End Sub

Any help would be appreciated.

I am using Visual Studio 2012 and I'm coding in vb.

From what I read _Scroll has been removed.

I was thinking that I could remove the scrollbar on the order listbox and control the both boxes by the scroller on the totals listbox.


回答1:


If you want to keep the selected indexes in sync, then you could do this:

Option Strict On
Option Explicit On

Public Class Form1

    Private Sub ListBox_SelectedIndexChanged(sender As Object, e As EventArgs)
        Dim parentListBox As ListBox = DirectCast(sender, ListBox)
        Dim childListBox As ListBox = DirectCast(parentListBox.Tag, ListBox)

        If parentListBox.SelectedIndex < childListBox.Items.Count Then
            childListBox.SelectedIndex = parentListBox.SelectedIndex
        End If
    End Sub

    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles Me.Load
        Me.ListBox1.Tag = Me.ListBox2
        Me.ListBox2.Tag = Me.ListBox1
        AddHandler ListBox1.SelectedIndexChanged, AddressOf ListBox_SelectedIndexChanged
        AddHandler ListBox2.SelectedIndexChanged, AddressOf ListBox_SelectedIndexChanged
    End Sub

End Class

However to get the actual scrolling to sync up, you'd need to draw the listbox items yourself. The following accomplishes this task, but it's really slow to scroll the parent listbox.

Option Strict On
Option Explicit On

Public Class Form1

    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles Me.Load
        Me.ListBox1.DrawMode = DrawMode.OwnerDrawFixed
        Me.ListBox2.DrawMode = DrawMode.OwnerDrawFixed
        Me.ListBox1.Tag = Me.ListBox2
        Me.ListBox2.Tag = Me.ListBox1
        AddHandler Me.ListBox1.DrawItem, AddressOf ListBox_DrawItem
        AddHandler Me.ListBox2.DrawItem, AddressOf ListBox_DrawItem
    End Sub

    Private Sub ListBox_DrawItem(sender As Object, e As DrawItemEventArgs)
        Dim parentListBox As ListBox = DirectCast(sender, ListBox)
        Dim childListBox As ListBox = DirectCast(parentListBox.Tag, ListBox)
        e.DrawBackground()
        e.DrawFocusRectangle()

        Dim brsh As New SolidBrush(Color.Black)

        If String.Compare(e.State.ToString, DrawItemState.Selected.ToString) > 0 Then brsh.Color = Color.White

        e.Graphics.DrawString(CStr(parentListBox.Items(e.Index)), e.Font, brsh, New RectangleF(e.Bounds.Location, e.Bounds.Size))

        childListBox.TopIndex = parentListBox.TopIndex

    End Sub

End Class

Also take note that there is no error checking to make sure that the items can actually be scrolled to, so if one listbox has more items, you'll get an exception at runtime.



来源:https://stackoverflow.com/questions/30484913/sync-2-list-boxes-to-1-scrollbar

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!