急:ListView的多行选择问题???

Karvey 2007-02-06 01:25:14
初期处理时把第5行设置为选择状态,
现想通过Shift键+Click来多选第4,5行,但是被选择的却是1到4行。
实在不知道怎么解决,请帮忙。(以下是源码)

[Form窗体的源码:(一ListView,与一Button)]

Const LVM_FIRST = &H1000
Const LVM_SETSELECTIONMARK = (LVM_FIRST + 67)
Const LVM_GETSELECTIONMARK = (LVM_FIRST + 66)

Const LVM_SETITEMSTATE = (LVM_FIRST + 43)

Const LVIS_FOCUSED = &H1
Const LVIS_SELECTED = &H2
Const LVIS_ACTIVATING = &H20

Const LVI_NOITEM = -1

Const LVNI_FOCUSED = &H1
Const LVNI_SELECTED = &H2

Const LVIF_INDENT = &H10
Const LVIF_STATE = &H8

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 Sub cmdReset_Click()

Call InitListView

End Sub

Private Sub InitListView()

ListView1.ListItems.Clear
ListView1.ColumnHeaders.Clear

ListView1.View = lvwReport
ListView1.MultiSelect = True

ListView1.ColumnHeaders.Add , , "main"
ListView1.ColumnHeaders.Add , , "sub1"
ListView1.ColumnHeaders.Add , , "sub2"

For i = 1 To 10
ListView1.ListItems.Add , i & "A", i
ListView1.ListItems(i & "A").SubItems(1) = i * 10
ListView1.ListItems(i & "A").SubItems(2) = i * 100
Next i

ListView1.FullRowSelect = True
ListView1.GridLines = True

' ListView1.SelectedItem.Selected = False
' ListView1.SetFocus
' ListView1.ListItems(5).Selected = True

'------------------------------------------------------
Dim nLvItem As lvItem

nLvItem.state = 0
nLvItem.stateMask = LVIS_FOCUSED Or LVIS_SELECTED
nLvItem.mask = LVIF_STATE
Call SendMessage(ListView1.hWnd, LVM_SETITEMSTATE, -1, nLvItem)
Call SendMessage(ListView1.hWnd, LVM_SETSELECTIONMARK, 0, 4)

Dim mLvItem As lvItem
mLvItem.state = LVIS_FOCUSED Or LVIS_SELECTED
mLvItem.stateMask = -1
mLvItem.mask = LVIF_STATE
Call SendMessage(ListView1.hWnd, LVM_SETITEMSTATE, 4, mLvItem)
Call SendMessage(ListView1.hWnd, LVM_SETSELECTIONMARK, 0, 4)

ListView1.SetFocus
End Sub

[模块的源码]:

Option Explicit

Type lvItem
mask As Long
iItem As Long
iSubItem As Long
state As Long
stateMask As Long
pszText As String
cchTextMax As Long
iImage As Long
lParam As Long
'#If WIN32_IE >= &H300 Then
iIndent As Long
'#End If
'#If WIN32_IE >= &H560 Then
iGroupId As Long
cColumns As Long ' tile view columns
puColumns As Long
'#End If

End Type
...全文
724 17 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
ap0106204 2007-02-08
  • 打赏
  • 举报
回复
難道這就是高手寫的....

本身可多行選擇,CheckBox屬性,MultiSelect屬性,FullRowSelect屬性.....

不會是為了高級好看吧......

或許 是想 多行 高亮度 選擇.........完全看不懂....
Karvey 2007-02-07
  • 打赏
  • 举报
回复
谢谢大家
不好意思,没有描述清楚.

VB6的环境(不是VC中,VC中没有问题)

现在想对ListView中选择行的数据进行删除,
删除后想把原来选择的下一行或前一行做成选择状态,便于继续的处理。
这个通过“ListView1.ListItems(行索引).Selected = True”可以解决。

比如,现在ListView中有数据11行,选择第5行并进行了删除,
后剩下10行数据,设置了第5行为选择状态。
因为是可以多选,这时想通过"Shift + 鼠标左键"来选择第4行,
但是出现了奇怪的现象:第4,5行没有被选择,而是第1行到第4行被选择上了。
感觉是因为内部的索引没有被设置上,
所以就就通过LVM_SETSELECTIONMARK来改变内部的索引,但是仍然不好用。

我传上去的代码没有删除的处理,只是一个设置选择行的。
lflyspace 2007-02-07
  • 打赏
  • 举报
回复
用Shift+Click好像不能实现,应该使用Ctrl+click就可以了。
kmlxk0 2007-02-07
  • 打赏
  • 举报
回复
其实大家都没看懂你的用意何在,不如重新描述一下问题吧,也许就有其他的解决办法了
zzyong00 2007-02-07
  • 打赏
  • 举报
回复
ListView1.MultiSelect = True
ListView1.FullRowSelect = True
Karvey 2007-02-07
  • 打赏
  • 举报
回复
等待高手出现!!!!!
Karvey 2007-02-07
  • 打赏
  • 举报
回复
本身的实现不了的。
ap0106204 2007-02-07
  • 打赏
  • 举报
回复
這功能用不著這樣做吧

ListView 本身有屬性可設多行選擇啊
Karvey 2007-02-07
  • 打赏
  • 举报
回复
好了,又另外作了个ByVal传递的SendMessageX,就可以了

kmlxk(xiaoKKKK) ,谢谢你
Karvey 2007-02-07
  • 打赏
  • 举报
回复
换成变量就不好用了啊,

换成变量怎么调用啊?
Karvey 2007-02-07
  • 打赏
  • 举报
回复
真的好用啊,
这是为什么啊?
如果最后一个是变量selIndex呢?
Call SendMessage(ListView1.hWnd, LVM_SETSELECTIONMARK, 0, ByVal selIndex)可以么?
kmlxk0 2007-02-07
  • 打赏
  • 举报
回复
修改了调用api的部分,
sendmessage 最后一个参数要按值传送

Dim nLvItem As lvItem

nLvItem.state = 0
nLvItem.stateMask = LVIS_FOCUSED Or LVIS_SELECTED
nLvItem.mask = LVIF_STATE
Call SendMessage(ListView1.hWnd, LVM_SETITEMSTATE, -1, nLvItem)
'Call SendMessage(ListView1.hWnd, LVM_SETSELECTIONMARK, 0, 4)
Call SendMessage(ListView1.hWnd, LVM_SETSELECTIONMARK, 0, ByVal 4)

Dim mLvItem As lvItem
mLvItem.state = LVIS_FOCUSED Or LVIS_SELECTED
mLvItem.stateMask = -1
mLvItem.mask = LVIF_STATE
Call SendMessage(ListView1.hWnd, LVM_SETITEMSTATE, 4, mLvItem)
'Call SendMessage(ListView1.hWnd, LVM_SETSELECTIONMARK, 0, 4)
Call SendMessage(ListView1.hWnd, LVM_SETSELECTIONMARK, 0, ByVal 4)

ListView1.SetFocus
Karvey 2007-02-07
  • 打赏
  • 举报
回复
不会还是没有说清楚吧???
Karvey 2007-02-06
  • 打赏
  • 举报
回复
怎么没有人帮忙啊,555
Karvey 2007-02-06
  • 打赏
  • 举报
回复

熟悉ListView的,或者感兴趣的

可以把代码直接拷贝出来,建个VB的工程就可以测试。
两个文件:
[Form窗体文件:(一ListView,与一Button)]
[模块文件]

十分感谢。
Karvey 2007-02-06
  • 打赏
  • 举报
回复
初期显示之后,想通过Shift键+Click来多选第4,5行,
而不是直接设置选择第4,5行

即使设置了lvItem的iItem也是不好用。
kmlxk0 2007-02-06
  • 打赏
  • 举报
回复
看不太清楚, 竟然几条SendMessage 的参数用的不是4,5
Call SendMessage(ListView1.hWnd, LVM_SETITEMSTATE, -1, mLvItem)

还有结构中
Type lvItem
mask As Long
iItem As Long <<结构体的相关项目也要赋值4,5

7,785

社区成员

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

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