2011-05-09 65 views
3

我正在使用Visual Studio 2008和VB.NET。我在窗體上有一個listview控件,並且使用windows窗體設計器添加了列。如你所知,如果你雙擊sizer或divider或者任何你想在兩列之間調用它的東西,左邊的列會自動調整大小(除非你禁用它)。我怎樣才能抓住這個特定的事件? ColumnWidthChanged事件和DoubleClick事件可能是候選人,但在ColumnWidthChanged事件中,我無法確定它是否是自動大小。同樣,沒有簡單的方法來捕獲與DoubleClick事件完全匹配的內容。有沒有人有任何想法,我怎麼可以趕上這種特定的事件類型?如何在VB.NET中的listview上捕獲autosize雙擊事件?

+0

當他們雙擊標題時,你打算提供什麼功能?我不知道有什麼方法(希望別人會),我只是好奇。 – 2011-05-09 22:23:52

+0

我有一個自定義算法來縮寫特定列中的數據,並且當用戶雙擊該標題的分隔符時,我需要捕獲它,以便我可以在該列下簡化數據。 – DynamiteReed 2011-05-10 13:53:43

回答

0

在列表視圖的頭部檢測事件非常棘手。

您將需要創建自己的標題來替換它通常使用的標題,然後聽取相應的消息。據我所知,沒有任何特定的列調整大小手柄。

以下類的子類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;聲明這個工作。

+0

啊,我剛剛意識到你正在尋找一個VB.NET解決方案。儘管將代碼轉換爲VB.NET應該不難。對於那個很抱歉! – 2011-05-22 10:33:29

+0

我已經使用http://www.developerfusion.com/tools/convert/csharp-to-vb/ – 2011-05-22 10:40:29

+0

將我的C#示例轉換爲VB.NET。我喜歡你的答案,但我決定使用不同的控件來避免這種瘋狂。不值得頭痛。 – DynamiteReed 2011-12-06 23:37:45