ListView 使用 TextBox 进行数据编辑的问题。附:我的解决方法
大家都知道 ListView 用来显示数据库数据有其优点,但是它没有办法编辑。这是一个头疼的问题。
一个比较好的办法就是使用 TextBox ,在点击 ListView 上相应内容的时候显示 TextBox 在该位置上,充当编辑。
可是大家怎么判定鼠标当前所在的列和行,怎么定位文本框的位置呢?
在 lxcc(虫子) 的代码的帮助下,我写了一个下面的代码,达到了一定的效果,可是大家有没有更好的办法呢???交流一下这方面的经验。
---------------------------------------------------------------------
Option Explicit
Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
Private Const LVM_FIRST = &H1000&
Private Const LVM_GETSUBITEMRECT = LVM_FIRST + 56&
Private Type RECT
Left As Long
Top As Long
Right As Long
Bottom As Long
End Type
'当前鼠标点击的列
Dim intColumn As Integer
Private Function ColumnByX(lv As ListView, x As Single) As Long
With lv
Dim org As RECT, ax As Long, i As Long
SendMessage .hwnd, LVM_GETSUBITEMRECT, i, org
ax = Me.ScaleX(x, vbTwips, Me.ScaleMode) - org.Left
For i = 1 To .ColumnHeaders.Count
ax = ax - .ColumnHeaders.Item(i).Width
If ax <= 0 Then
Exit For
End If
Next
If i > .ColumnHeaders.Count Then i = -1
End With
ColumnByX = i
End Function
Private Sub Form_Load()
Dim i As Integer
Dim itemx As ListItem
ListView1.ColumnHeaders.Add , , "标题 1"
ListView1.ColumnHeaders.Add , , "标题 2"
ListView1.ColumnHeaders.Add , , "标题 3"
ListView1.ColumnHeaders.Add , , "标题 4"
ListView1.ColumnHeaders.Add , , "标题 5"
ListView1.ColumnHeaders.Add , , "标题 6"
For i = 1 To 100
Set itemx = ListView1.ListItems.Add(, , CStr(i))
ListView1.ListItems(i).SubItems(1) = i
ListView1.ListItems(i).SubItems(2) = i
ListView1.ListItems(i).SubItems(3) = i
ListView1.ListItems(i).SubItems(4) = i
ListView1.ListItems(i).SubItems(5) = i
Next
End Sub
Private Sub ListView1_ItemClick(ByVal Item As MSComctlLib.ListItem)
Text1.Width = ListView1.ColumnHeaders(intColumn).Width - 10
Text1.Height = ListView1.ListItems(1).Height - 100
Text1.Top = Item.Top + 100
Text1.Left = ListView1.ColumnHeaders(intColumn).Left + 100
If intColumn = 1 Then
Text1.Text = Item.Text
Else
Text1.Text = Item.SubItems(intColumn - 1)
End If
Text1.SetFocus
Text1.SelStart = 0
Text1.SelLength = Len(Text1.Text)
End Sub
Private Sub ListView1_MouseDown(Button As Integer, Shift As Integer, x As Single, y As Single)
intColumn = ColumnByX(ListView1, x)
End Sub