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