ListView 使用 TextBox 进行数据编辑的问题。附:我的解决方法

roger_xiong 2004-04-16 01:45:39
大家都知道 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
...全文
130 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
huangjianyou 2004-07-14
  • 打赏
  • 举报
回复
listview + textbox  不如 mshflexgrid + textbox
yqs7977 2004-07-14
  • 打赏
  • 举报
回复
这个listview的问题还真是多啊,我觉得控件都是vc写出来再给vb调用的,要用vb写真的是就拉出了底层的东西,就是加一个很小的功能都会多出很多问题,这个时候我们就会想,要是谁给我一个改进了控件就好,可是微软偏偏不发布,你说多累啊,所以当你对某个控件要更多需求的时候,不要想着用vb改进了,
roger_xiong 2004-04-16
  • 打赏
  • 举报
回复
我发现如果listview不能显示下所有的列,而是需要拖动滚动条的话,用上面的方法得出的鼠标点击的当前列就会错误啊!!!

呜呜呜呜,大家还有什么办法获得鼠标点击的当前列的方法没有啊???

晕晕的~
Lucky_GuoGuo 2004-04-16
  • 打赏
  • 举报
回复
做了一下修改,text1的Appearance 属性设置为0-flat,text1的位置还需要做一点调整即可了。

Private Sub ListView1_ItemClick(ByVal Item As MSComctlLib.ListItem)
Dim nTop As Long, nLeft As Long, nWidth As Long, nHeight As Long
Dim nCol As Long

nLeft = 0
For nCol = 1 To intColumn
nLeft = nLeft + ListView1.ColumnHeaders(nCol).Width
Next
nTop = ListView1.Top + Item.Top + 30
nLeft = nLeft + ListView1.Left
nWidth = ListView1.ColumnHeaders(intColumn).Width
nHeight = Item.Height

Text1.Text = Item.SubItems(intColumn)

Text1.Move nLeft, nTop, nWidth, nHeight

Text1.SetFocus
End Sub
Rex_love_Burger 2004-04-16
  • 打赏
  • 举报
回复
同楼上的,我也是这样做的。但是我用的是mshFlexGrid代替的ListView
RUKYO 2004-04-16
  • 打赏
  • 举报
回复
呵呵,我没有做这样精确的定位,在ListView1_ItemClick事件后对应ListItem的一些TextBox就显示相关的资料。

7,763

社区成员

发帖
与我相关
我的任务
社区描述
VB 基础类
社区管理员
  • VB基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧