Private Sub Form_Load()
Dim i As Integer
ListView1.View = lvwReport
ListView1.GridLines = True
For i = 1 To 20
ListView1.ColumnHeaders.Add , , "col" & i
ListView1.ListItems.Add , , "row" & i
Next
End Sub
Private Sub ListView1_MouseMove(Button As Integer, Shift As Integer, x As Single, y As Single)
Dim getRow As Long, getCol As Long
Dim itmTmp As ListItem
getCol = 0
Do
getCol = getCol + 1
x = x - ListView1.ColumnHeaders(getCol).Width
Loop Until x < 0
Me.Caption = getRow & "," & getCol
End Sub
uj5u.com熱心網友回復:
漏寫一行,修正一下
Option Explicit
Private Sub Form_Load()
Dim i As Integer
ListView1.View = lvwReport
ListView1.GridLines = True
For i = 1 To 20
ListView1.ColumnHeaders.Add , , "col" & i
ListView1.ListItems.Add , , "row" & i
Next
End Sub
Private Sub ListView1_MouseMove(Button As Integer, Shift As Integer, x As Single, y As Single)
Dim getRow As Long, getCol As Long
Dim itmTmp As ListItem
Private Sub Form_Load()
Dim i As Integer
ListView1.View = lvwReport
ListView1.GridLines = True
For i = 1 To 10
ListView1.ColumnHeaders.Add , , "col" & i
ListView1.ListItems.Add , , "row" & i
Next
End Sub
Private Sub ListView1_MouseMove(Button As Integer, Shift As Integer, x As Single, y As Single)
Dim getRow As Long, getCol As Long
Dim itmTmp As ListItem
Set itmTmp = ListView1.GetFirstVisible
'獲取行,首先獲取第一條顯示的item,它的top值就是列頭的高度,去掉這個固定的高度以后,
'滑鼠Y坐標整除item高度得到的就是滑鼠指向顯示區域的第幾條記錄,再加上首行item的index,
'就是當前滑鼠所指行的index
getRow = (y - itmTmp.Top) \ itmTmp.Height + itmTmp.Index
If getRow > ListView1.ListItems.Count Then getRow = -1
getCol = 0
x = x - itmTmp.Left
Do
getCol = getCol + 1
If getCol > ListView1.ColumnHeaders.Count Then
getCol = -1
Exit Do
End If
x = x - ListView1.ColumnHeaders(getCol).Width
Loop Until x < 0
Option Explicit
Dim getRow As Long, getCol As Long
Dim CX As Long, CY As Long
Dim getPos As Boolean
Private Sub Form_Load()
Dim i As Integer
Text1.Visible = False
Text1.Appearance = 0
ListView1.Appearance = 0
ListView1.View = lvwReport
ListView1.GridLines = True
ListView1.FullRowSelect = True
ListView1.LabelEdit = lvwManual
For i = 1 To 20
ListView1.ColumnHeaders.Add , , "col" & i
ListView1.ListItems.Add , , "row" & i
Next
getPos = True
End Sub
Private Sub ListView1_DblClick()
If getCol <= 1 Then Exit Sub
Timer1.Interval = 50
Timer1.Enabled = True
Text1.Text = ListView1.ListItems(getRow).SubItems(getCol - 1)
End Sub
'listview 沒有scoll事件,為了在編輯狀態下讓textbox跟蹤單元格的位置而使用了timer
Private Sub Timer1_Timer()
Dim i As Long
Dim tmpleft As Long
Static focusFlag As Boolean
getPos = False
tmpleft = ListView1.Left + ListView1.GetFirstVisible.Left
If getRow > 0 And getCol > 0 Then
For i = 2 To getCol
tmpleft = tmpleft + ListView1.ColumnHeaders(i).Width
Next
Text1.Left = tmpleft
Text1.Top = ListView1.Top + (getRow - ListView1.GetFirstVisible.Index) * ListView1.GetFirstVisible.Height + ListView1.GetFirstVisible.Top
Text1.Width = ListView1.ColumnHeaders(getCol).Width
Text1.Height = ListView1.GetFirstVisible.Height
'單元格移動進出listview顯示區域的時候控制textbox是否顯示
If Text1.Left < ListView1.Left Or Text1.Top < ListView1.Top + ListView1.GetFirstVisible.Top Then
Text1.Visible = False: focusFlag = False
Else
Text1.Visible = True
If Not focusFlag Then Text1.SetFocus: focusFlag = True '這個控制是為了防止頻繁的設定焦點導致其他操作受影響
End If
End If
End Sub
Private Sub Text1_KeyPress(KeyAscii As Integer)
If KeyAscii <> 13 Then Exit Sub
Timer1.Enabled = False
ListView1.ListItems(getRow).SubItems(getCol - 1) = Text1.Text
getPos = True
Text1.Visible = False
End Sub
Private Sub ListView1_MouseMove(Button As Integer, Shift As Integer, x As Single, y As Single)
If Not getPos Then Exit Sub
Dim itmTmp As ListItem
CX = x
CY = y
Set itmTmp = ListView1.GetFirstVisible
'獲取行,首先獲取第一條顯示的item,它的top值就是列頭的高度,去掉這個固定的高度以后,
'滑鼠Y坐標整除item高度得到的就是滑鼠指向顯示區域的第幾條記錄,再加上首行item的index,
'就是當前滑鼠所指行的index
getRow = (y - itmTmp.Top) \ itmTmp.Height + itmTmp.Index
If getRow > ListView1.ListItems.Count Then getRow = -1
getCol = 0
x = x - itmTmp.Left
Do
getCol = getCol + 1
If getCol > ListView1.ColumnHeaders.Count Then
getCol = -1
Exit Do
End If
x = x - ListView1.ColumnHeaders(getCol).Width
Loop Until x < 0