我正在使用 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/