vb.net - 如何在 VB.NET 的 ListView 上捕获自动调整大小的双击事件?

标签 vb.net winforms

我正在使用 Visual Studio 2008 和 VB.NET。我的窗体上有一个 listview 控件,我使用 Windows 窗体设计器添加了列。如您所知,如果您双击 sizer 或分隔符或您想要在两列之间调用它的任何内容,左侧的列将自动调整大小(除非您禁用它)。我怎样才能捕获这个特定的事件? ColumnWidthChanged 事件和 DoubleClick 事件可能是候选者,但在 ColumnWidthChanged 事件中,我无法确定它是否是自动尺寸。同样,也没有简单的方法来准确捕获 DoubleClick 事件中单击的内容。有谁知道我如何捕捉这种特定的事件类型?

最佳答案

检测 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

您需要包含一个 using System.Runtime.InteropServices;声明此工作。

关于vb.net - 如何在 VB.NET 的 ListView 上捕获自动调整大小的双击事件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5943112/

相关文章:

c# - 请告诉我在 Windows 窗体项目中使用的体系结构

c# - 使用 AutoSize=false 防止标签自动换行

c# - 在 Windows 窗体应用程序中突出显示按钮

mysql - 如何检查字符串是否包含日期?

c# - Subsonic 3 - 隐藏命名空间 - 可能是我

mysql - VB.NET 向 MySQL 缓慢插入 Datagrid 行

c# - 如果没有另一个实例,则打开一个表单 Open - 将类型传递给方法

c# - "this"在 C# 方法签名中指的是什么,是否有 VB.NET 等效项?

vb.net - Selenium:使用 chrome 驱动程序将文件下载到特定文件夹

c# - 如何使用服务器模式在 GridView 中获取异常详细信息?