怎样让多个ListBox的滚动条同步?

时间:2023-01-27 11:49:49
现在有多个ListBox,每个ListBox的项目的数量是相等的

现在我想拖动其中一个ListBox的滚动条,让其他ListBox的滚动条也能跟着一起动

就是说滚动幅度都是一致的

10 个解决方案

#1


我也試過這個問題,不能成功。除排你給ListBox外加滾動條,就可以解你的問題。

#2



'经本人测试成功,而且还加了那么多注释,不能说不会看的啊~~~
'最后当然要记得给分了啊 ^_^
Imports System.Runtime.InteropServices

Public Class Form1

    ''' <summary>垂直滚动条 </summary>
    Private Const WM_VSCROLL = &H115

    ''' <summary>水平滚动条 </summary>
    Private Const WM_HSCROLL = &H114

    <DllImport("user32")> _
    Public Shared Function SendMessageA(ByVal hwnd As IntPtr, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Object) As IntPtr
    End Function

    ''' <summary> 看清楚 Handles 后面的啊~~</summary>
    Private Sub ListBox1_MouseWheel(ByVal sender As Object, _
                                    ByVal e As System.Windows.Forms.MouseEventArgs) Handles ListBox1.MouseWheel, ListBox2.MouseWheel
        If e.Delta < 0 Then
            '//Delta < 0 ,垂直滚动条向下滚动
            SendMessageA(ListBox2.Handle, WM_VSCROLL, 1, vbNull)

        Else
            '//Delta > 0 ,垂直滚动条向下滚动
            SendMessageA(ListBox2.Handle, WM_VSCROLL, 0, vbNull)
        End If

    End Sub

    ''' <summary>向两个ListBox填充内容,使其出现滚动条 </summary>
    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        For i = 1 To 20
            ListBox1.Items.Add(i)
            ListBox2.Items.Add(i)
        Next

    End Sub
End Class

#3


发现错了,ListBox1.MouseWheel和 ListBox2.MouseWheel要分开写.

#4


建议CSDN能开放修改权限,代码经常要改的啊,限制在半个小时内改也行~~~

#5


一起写也不要紧,里面判断一下CType(Sender,Listbox).Name 再决定向另一个ListBox SendMessage即可,稍微改一下

    Private Sub ListBox1_MouseWheel(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles ListBox1.MouseWheel, ListBox2.MouseWheel
        Dim H As System.IntPtr
        If CType(sender, ListBox).Name = "ListBox1" Then
            H = ListBox2.Handle
        Else
            H = ListBox1.Handle
        End If


        If e.Delta < 0 Then
            '//Delta < 0 ,垂直滚动条向下滚动
            SendMessageA(H, WM_VSCROLL, 1, vbNull)

        Else
            '//Delta > 0 ,垂直滚动条向下滚动
            SendMessageA(H, WM_VSCROLL, 0, vbNull)
        End If

    End Sub


#6


用不了啊

检测到 PInvokeStackImbalance
Message: 对 PInvoke 函数“WindowsApplication1!WindowsApplication1.Form1::SendMessageA”的调用导致堆栈不对称。原因可能是托管的 PInvoke 签名与非托管的目标签名不匹配。请检查 PInvoke 签名的调用约定和参数与非托管的目标签名是否匹配。

#7


比较麻烦,没那么简单,至少下头的函数我想是要用到的:
SetScrollPos,GetScrollInfo等

#8


我就奇怪了,为什么一定要用ListBox呢?实现起来麻烦死了,用DataGridView不是很方便吗?

#9


而且楼上的代码我都试验过了,是可行的,楼主偏说不行。楼上的代码演示的是按鼠标的滚轮实现同时移动,而不是拉滚动条

#10


我今天做了一个比较完美的解决方法,谁想要的,PM Me.
因为代码有点长,不想再贴出来.

#1


我也試過這個問題,不能成功。除排你給ListBox外加滾動條,就可以解你的問題。

#2



'经本人测试成功,而且还加了那么多注释,不能说不会看的啊~~~
'最后当然要记得给分了啊 ^_^
Imports System.Runtime.InteropServices

Public Class Form1

    ''' <summary>垂直滚动条 </summary>
    Private Const WM_VSCROLL = &H115

    ''' <summary>水平滚动条 </summary>
    Private Const WM_HSCROLL = &H114

    <DllImport("user32")> _
    Public Shared Function SendMessageA(ByVal hwnd As IntPtr, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Object) As IntPtr
    End Function

    ''' <summary> 看清楚 Handles 后面的啊~~</summary>
    Private Sub ListBox1_MouseWheel(ByVal sender As Object, _
                                    ByVal e As System.Windows.Forms.MouseEventArgs) Handles ListBox1.MouseWheel, ListBox2.MouseWheel
        If e.Delta < 0 Then
            '//Delta < 0 ,垂直滚动条向下滚动
            SendMessageA(ListBox2.Handle, WM_VSCROLL, 1, vbNull)

        Else
            '//Delta > 0 ,垂直滚动条向下滚动
            SendMessageA(ListBox2.Handle, WM_VSCROLL, 0, vbNull)
        End If

    End Sub

    ''' <summary>向两个ListBox填充内容,使其出现滚动条 </summary>
    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        For i = 1 To 20
            ListBox1.Items.Add(i)
            ListBox2.Items.Add(i)
        Next

    End Sub
End Class

#3


发现错了,ListBox1.MouseWheel和 ListBox2.MouseWheel要分开写.

#4


建议CSDN能开放修改权限,代码经常要改的啊,限制在半个小时内改也行~~~

#5


一起写也不要紧,里面判断一下CType(Sender,Listbox).Name 再决定向另一个ListBox SendMessage即可,稍微改一下

    Private Sub ListBox1_MouseWheel(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles ListBox1.MouseWheel, ListBox2.MouseWheel
        Dim H As System.IntPtr
        If CType(sender, ListBox).Name = "ListBox1" Then
            H = ListBox2.Handle
        Else
            H = ListBox1.Handle
        End If


        If e.Delta < 0 Then
            '//Delta < 0 ,垂直滚动条向下滚动
            SendMessageA(H, WM_VSCROLL, 1, vbNull)

        Else
            '//Delta > 0 ,垂直滚动条向下滚动
            SendMessageA(H, WM_VSCROLL, 0, vbNull)
        End If

    End Sub


#6


用不了啊

检测到 PInvokeStackImbalance
Message: 对 PInvoke 函数“WindowsApplication1!WindowsApplication1.Form1::SendMessageA”的调用导致堆栈不对称。原因可能是托管的 PInvoke 签名与非托管的目标签名不匹配。请检查 PInvoke 签名的调用约定和参数与非托管的目标签名是否匹配。

#7


比较麻烦,没那么简单,至少下头的函数我想是要用到的:
SetScrollPos,GetScrollInfo等

#8


我就奇怪了,为什么一定要用ListBox呢?实现起来麻烦死了,用DataGridView不是很方便吗?

#9


而且楼上的代码我都试验过了,是可行的,楼主偏说不行。楼上的代码演示的是按鼠标的滚轮实现同时移动,而不是拉滚动条

#10


我今天做了一个比较完美的解决方法,谁想要的,PM Me.
因为代码有点长,不想再贴出来.