找回密码
 加入
搜索
查看: 2630|回复: 8

怎么修改才能让listview的item项也可以在原位上被修改

[复制链接]
发表于 2008-8-19 00:40:47 | 显示全部楼层 |阅读模式
在官网上看到一个udf可以在listview的子项上修改相应的数据
不知道哪位大侠可以改一下,能够使item项也可以被修改
原函数


#include <GuiConstantsEx.au3>
#include <GuiListView.au3>
#include <GuiEdit.au3>
#include <WindowsConstants.au3>
#include <EditConstants.au3>
#include <WinAPI.au3>

Opt("GuiCloseOnESC", 0)

Global $hEdit, $Item = -1, $SubItem = 0

Global $Style = BitOR($WS_CHILD, $WS_VISIBLE, $WS_BORDER, $ES_AUTOHSCROLL, $ES_LEFT)

$hGUI = GUICreate("ListView Subitems edit in place", 300, 200)

$hListView = _GUICtrlListView_Create($hGUI, "Items|SubItems", 2, 2, 296, 196, BitOR($LVS_EDITLABELS, $LVS_REPORT))
_GUICtrlListView_SetExtendedListViewStyle($hListView, $LVS_EX_GRIDLINES)

For $i = 1 To 10
    _GUICtrlListView_AddItem($hListView, "Item " & $i)
    _GUICtrlListView_AddSubItem($hListView, $i - 1, "SubItem " & $i, 1)
Next

GUIRegisterMsg($WM_NOTIFY, "WM_NOTIFY")
GUIRegisterMsg($WM_COMMAND, "WM_COMMAND")

GUISetState()

Do
Until GUIGetMsg() = $GUI_EVENT_CLOSE

Func WM_NOTIFY($hWnd, $iMsg, $iwParam, $ilParam)
    Local $tNMHDR, $hWndFrom, $iCode

    $tNMHDR = DllStructCreate($tagNMHDR, $ilParam)
    $hWndFrom = DllStructGetData($tNMHDR, "hWndFrom")
    $iCode = DllStructGetData($tNMHDR, "Code")
    
    Switch $hWndFrom
        Case $hListView
            Switch $iCode
                Case $NM_DBLCLK
                    Local $aHit = _GUICtrlListView_SubItemHitTest($hListView)
                    If ($aHit[0] <> -1) And ($aHit[1] > 0) Then
                        $Item = $aHit[0]
                        $SubItem = $aHit[1]
                        Local $iSubItemText = _GUICtrlListView_GetItemText($hListView, $Item, $SubItem)
                        Local $aRect = _GUICtrlListView_GetSubItemRect($hListView, $Item, $SubItem)
                        $hEdit = _GUICtrlEdit_Create($hGUI, $iSubItemText, $aRect[0] + 1, $aRect[1] - 4, $aRect[2] - $aRect[0], 20, $Style)
                        _WinAPI_SetFocus($hEdit)
                    EndIf
            EndSwitch
    EndSwitch
        
    Return $GUI_RUNDEFMSG
EndFunc

Func WM_COMMAND($hWnd, $Msg, $wParam, $lParam)
    Local $iCode = BitShift($wParam, 16)
    
    Switch $lParam
        Case $hEdit
            Switch $iCode
                Case $EN_KILLFOCUS
                    Local $iText = _GUICtrlEdit_GetText($hEdit)
                    _GUICtrlListView_SetItemText($hListView, $Item, $iText, $SubItem)
                    _WinAPI_DestroyWindow($hEdit)
                    $Item = -1
                    $SubItem = 0
            EndSwitch
    EndSwitch
    
    Return $GUI_RUNDEFMSG
EndFunc


[ 本帖最后由 ken0137 于 2008-8-20 20:57 编辑 ]
发表于 2008-8-19 22:19:52 | 显示全部楼层
这个例子麻烦了,用_GUICtrlListView_EditLabel 就可以做到。
帮助里有例子
发表于 2008-8-20 01:48:24 | 显示全部楼层
zcbenz兄最近神龙见首不见尾。。。。
 楼主| 发表于 2008-8-20 19:43:23 | 显示全部楼层
真的不会用啊,能不能给个例子
例如双击一下listview,就可以修改
发表于 2008-8-20 20:27:00 | 显示全部楼层
我也想过要实现这个理想,可惜,_GUICtrlListView_EditLabel  只能修改第一列,并不能随意修改任意一列,不知道是不是只有我发生这种情况? zcbenz 兄台?

最后没办法,还是变通着,改成单击一行后,弹出新窗口加载该行数据来供用户修改任意值,这个新窗口中使用普通input 和commbo方法。
 楼主| 发表于 2008-8-20 20:30:50 | 显示全部楼层
我在想能不能用一楼的办法和_GUICtrlListView_EditLabel 合成一下,
不知道哪位大侠可以搞一下,造福大家
发表于 2008-8-20 20:46:05 | 显示全部楼层
没留意到原来一楼那个是好东西,以为是你的问题代码,就没仔细看,呵呵,我看一下先。
发表于 2008-8-20 20:49:53 | 显示全部楼层
真是神奇的代码啊,让我深深地知道自己还不是一般的菜。

虽然没能完全看懂它是怎么实现的,不过我看到似乎是这个原因导致不能改第一列的:它将可改列检查以大于0开始,而第一列的索引就是0,所以你把 44 行的条件改成 大于等于 0 就好了,如:

If ($aHit[0] <> -1) And ($aHit[1] >= 0) Then
 楼主| 发表于 2008-8-20 20:57:22 | 显示全部楼层
哈哈,真是个达人,我刚开始看的时候可是一头雾水
现在也是,
您需要登录后才可以回帖 登录 | 加入

本版积分规则

QQ|手机版|小黑屋|AUTOIT CN ( 鲁ICP备19019924号-1 )谷歌 百度

GMT+8, 2024-6-4 21:42 , Processed in 0.075749 second(s), 20 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表