首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VB >

急ListView的多行选择有关问题?

2012-01-16 
急:ListView的多行选择问题???初期处理时把第5行设置为选择状态,现想通过Shift键+Click来多选第4,5行,但是

急:ListView的多行选择问题???
初期处理时把第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


[解决办法]
修改了调用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

热点排行