如何在VB.NET中的listview上捕获自动调整大小双击事件?

时间:2011-05-09 22:12:17

标签: vb.net winforms

我正在使用Visual Studio 2008和VB.NET。我的表单上有一个listview控件,我使用windows窗体设计器添加了列。如您所知,如果双击sizer或divider或者要在两列之间调用它的任何内容,左侧的列将自动调整大小(除非您禁用它)。我怎样才能抓住这个具体事件? ColumnWidthChanged事件和DoubleClick事件可能是候选人,但在ColumnWidthChanged事件中,我无法确定是否为自动调整大小。同样,没有简单的方法可以捕获与DoubleClick事件完全相同的内容。有没有人有任何想法我怎么能抓住这个特定的事件类型?

1 个答案:

答案 0 :(得分:0)

检测listview标题上的事件非常棘手。

您需要创建自己的标头来替换它通常使用的标头,然后收听相应的消息。据我所知,列调整大小句柄没有任何具体的。

以下类继承ListView并添加一个检测列之间双击的处理程序。我认为这就像它一样接近。

我希望它能帮助你。

    Class MyListView
        Inherits ListView

        Protected Overrides Sub CreateHandle()
            MyBase.CreateHandle()
            New HeaderControl(Me)
        End Sub

        Private Class HeaderControl
            Inherits NativeWindow
            Private _parent As ListView = Nothing

            <DllImport("User32.dll", CharSet := CharSet.Auto, SetLastError := True)> _
            Public Shared Function SendMessage(hWnd As IntPtr, msg As Integer, wParam As IntPtr, lParam As IntPtr) As IntPtr
            End Function

            Public Sub New(parent As ListView)
                _parent = parent

                Dim header As IntPtr = SendMessage(parent.Handle, (&H1000 + 31), IntPtr.Zero, IntPtr.Zero)
                Me.AssignHandle(header)
            End Sub


            Protected Overrides Sub WndProc(ByRef message As Message)
                Const  WM_LBUTTONDBLCLK As Integer = &H203

                Select Case message.Msg
                    Case WM_LBUTTONDBLCLK
                        Dim position As Point = Control.MousePosition
                        Dim relative As Point = _parent.PointToClient(position)

                        Dim rightBorder As Integer = 0
                        For Each c As ColumnHeader In _parent.Columns
                            rightBorder += c.Width
                            If relative.X > (rightBorder - 6) AndAlso relative.X < (rightBorder + 6) Then
                                MessageBox.Show([String].Format("Double-click after column '{0}'", c.Text))
                            End If
                        Next
                        Exit Select
                End Select


                MyBase.WndProc(message)


            End Sub

        End Class
    End Class

您需要包含一个使用System.Runtime.InteropServices;声明这项工作。