程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> .NET實例教程 >> VB程序中實現ListView獲取Item和SubItem的Text

VB程序中實現ListView獲取Item和SubItem的Text

編輯:.NET實例教程
在ListView中點擊鼠標,可以通過SelectedItem屬性來獲取當前點擊了哪一個ListItem,然後通過在ListVIEw的MouseUp事件中通過判斷鼠標坐標和ColumnHeader的寬度來得知是點擊了哪一列。此方法雖然簡單,但不夠“聰明”,使用起來有局限性。

而最可行的辦法還是用API來實現。主要思路是獲取鼠標位置,將改鼠標位置轉換為窗體控件的相對位置,然後向該窗體發送LVM_SUBITEMHITTEST消息以獲取到具體的Item或者SubItem對象。

需要添加的API函數聲明:



Public Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
Public Declare Function GetCursorPos Lib "user32" (lpPoint As POINTAPI) As Long
Public Declare Function ScreenToClIEnt Lib "user32" (ByVal hwnd As Long, lpPoint As POINTAPI) As Long

需要增加的變量定義:



Public Type POINTAPI
    x As Long
    y As Long
End Type

Public Type LVHITTESTINFO
   pt As POINTAPI
   flags As Long
   iItem As Long
   iSubItem As Long
End Type

'ListVIEw所需的變量
Public Const LVM_FIRST = &H1000
Public Const LVM_SUBITEMHITTEST = (LVM_FIRST + 57)

具體程序代碼:



Private Sub ltvLog_MouseMove(Button As Integer, Shift As Integer, x As Single, y As Single)
    Dim lvhti As LVHITTESTINFO
    
    Dim iItem As Integer, iSubItem As Integer

    Call GetCursorPos(lvhti.pt)
    Call ScreenToClIEnt(ltvLog.hwnd, lvhti.pt)
    Call SendMessage(ltvLog.hwnd, LVM_SUBITEMHITTEST, 0, lvhti.pt)

    iItem = lvhti.iItem
    iSubItem = lvhti.iSubItem
    
    If iItem < 0 Then
        '沒有ListItem對象
    Else
       &nbsp;If iSubItem = 0 Then
            '某行第一列
            Debug.print ltvLog.ListItems(iItem + 1).Text
        Else
            '某行第某列
            Debug.print ltvLog.ListItems(iItem + 1).ListSubItems(iSubItem).Text
        End If
    End If
End Sub
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved