andersonljw 发表于 2010-5-16 12:18:00

请问listview中每行如何读取到input控件中,急用,谢谢!!

如题,请问listview中每行如何读取到input控件中,急用,谢谢!!

lanfengc 发表于 2010-5-16 12:35:37

_GUICtrlListBox_XXXXX相关的一系列函数就可以了.

lynfr8 发表于 2010-5-16 22:36:30

_GUICtrlListView_GetItemTextArray
获取全部列表视图项#include <GuiConstantsEx.au3>
#include <GuiListView.au3>
Global $aItem, $sText, $hListView
GUICreate("ListView Get Item Text Array", 400, 300)
$hListView = GUICtrlCreateListView("col1|col2|col3", 2, 2, 394, 268)
GUICtrlCreateListViewItem("line1|data1|more1", $hListView)
GUICtrlCreateListViewItem("line2|data2|more2", $hListView)
GUISetState()
; 获取项目 2 的文本
$aItem = _GUICtrlListView_GetItemTextArray($hListView, 1)
For $i = 1 To $aItem
        $sText &= StringFormat("Column[%2d] %s", $i, $aItem[$i]) & @LF
Next
MsgBox(4160, "Information", "Item 2 (All Columns) Text: " & @LF & @LF & $sText)
; 循环至用户退出
Do
Until GUIGetMsg() = $GUI_EVENT_CLOSE
GUIDelete()希望能详细看看_GUICtrlListView和_GUICtrlTreeView这两个重点UDF,
太多坛友提问的问题其实都可以自己从帮助文件找
再说,也有汉化版了

lynfr8 发表于 2010-5-16 22:39:53

如何读取到input控件
GUICtrlSetData($Input , $aItem[$i])
这里牵涉到数组问题了,自行尝试解决

andersonljw 发表于 2010-5-17 12:13:42

谢谢 狼兄!!!我的问题解决了一部分
目前存在的困难是:双击listview中某行条目,其就自动将各列内容 如 张飞|赵云|关羽|刘备 提取到
input1,input2,input3,input4
烦给个思路,谢谢。

lynfr8 发表于 2010-5-17 16:19:06

#include <GuiConstantsEx.au3>
#include <GuiListView.au3>
#include <ListViewConstants.au3>
#include <WindowsConstants.au3>
Global $aItem, $input
GUICreate("ListView Get Item Text Array 简单应用", 400, 320)
GUIRegisterMsg($WM_NOTIFY, "WM_NOTIFY")
$ListView1 = GUICtrlCreateListView("col1|col2|col3|col4", 2, 2, 394, 168)
GUICtrlCreateListViewItem("张学友|刘德华|黎明|郭富城", $ListView1)
GUICtrlCreateListViewItem("张飞|赵云|关羽|刘备", $ListView1)
$input = GUICtrlCreateinput("", 2, 200, 100, 25)
$input = GUICtrlCreateinput("", 2, 230, 100, 25)
$input= GUICtrlCreateinput("", 2, 260, 100, 25)
$input= GUICtrlCreateinput("", 2, 290, 100, 25)
GUISetState()

Do
Until GUIGetMsg() = $GUI_EVENT_CLOSE
GUIDelete()

Func WM_NOTIFY($hWndGUI, $MsgID, $WParam, $LParam)
        Local $tagNMHDR, $Event, $hWndFrom, $IDFrom
        Local $tagNMHDR = DllStructCreate("int;int;int", $LParam)
        If @error Then Return $GUI_RUNDEFMSG
        $IDFrom = DllStructGetData($tagNMHDR, 2)
        $Event = DllStructGetData($tagNMHDR, 3)
        $tagNMHDR = 0
        Switch $IDFrom;选择产生事件的控件
                Case $ListView1
                        Switch $Event; 选择产生的事件
                                Case $NM_CLICK ; 左击
;~                                         ...
                                Case $NM_DBLCLK ; 双击
                                        $Index = _GUICtrlListView_GetSelectedIndices($ListView1); 获取被选的索引
                                        If Not StringLen($Index) Then; 判断是否选定Item
                                                MsgBox(0, "", "未选定")
                                                Return
                                        EndIf
                                        $aItem = _GUICtrlListView_GetItemTextArray($ListView1, Number($Index))
                                        For $i = 1 To $aItem
GUICtrlSetData($input[$i],$aItem[$i])
Next               
                                Case $NM_RCLICK ; 右击
;~                                         ...
                        EndSwitch
        EndSwitch
        Return $GUI_RUNDEFMSG
EndFunc   ;==>WM_NOTIFY关键思路:
1.利用数组创建input控件:$input,方便在for next循环里写入数据
2.注册鼠标点击控件ListViewItem事件:GUIRegisterMsg和WM_NOTIFY,此2函数经常应用,论坛例子非常多,必须掌握
3.获取双击被选的索引_GUICtrlListView_GetSelectedIndices()得到索引后用_GUICtrlListView_GetItemTextArray获取控件文字写入数组$aItem[$i]
4.通过循环语句GUICtrlSetData($input[$i],$aItem[$i])达到最终目的:循环写入input1,input2,input3,input4
5.万变不离其中,对于函数的灵活运用和其他函数交叉运用才是关键中的关键

andersonljw 发表于 2010-5-17 22:47:18

太感谢了,解了燃眉之急。。。看来自己还有好多不足,例如注册事件等。。再次谢谢。元老就是元老。

呵呵,心中又有点问题烦劳提示:我listview内容是从ini文件中提取出来的,但是我想做个功能,就是如上
输入张飞,点击搜索 便可搜索到张飞所在列表字段,并将字段所有内容自动提取到各个INPUT框中,若再点搜索,则可如上顺序提取下一个含张飞的字段内容,知道最后一个提示搜索完毕。
可能有点麻烦,正在思考学习中。。大侠若有简洁思路烦劳再提示一下
无论如何。真是发自肺腑的说一声。。。谢谢。。。

netegg 发表于 2010-5-17 23:19:15

本帖最后由 netegg 于 2010-5-17 23:20 编辑

去玩数据库吧,把数据导入数据库,一个查询全出来

lynfr8 发表于 2010-5-18 02:55:47

#include <GuiConstantsEx.au3>
#include <GuiListView.au3>
#include <ListViewConstants.au3>
#include <WindowsConstants.au3>
Global $aItem, $input
GUICreate("ListView Get Item Text Array 简单应用", 400, 320)
GUIRegisterMsg($WM_NOTIFY, "WM_NOTIFY")
$ListView1 = GUICtrlCreateListView("col1|col2|col3|col4", 2, 2, 394, 168)
GUICtrlCreateListViewItem("张学友1|刘德华|黎明|郭富城", $ListView1)
GUICtrlCreateListViewItem("张飞1|赵云|关羽|刘备", $ListView1)
GUICtrlCreateListViewItem("张学友2|刘德华|黎明|郭富城", $ListView1)
GUICtrlCreateListViewItem("张飞2|赵云|关羽|刘备", $ListView1)
GUICtrlCreateListViewItem("张学友3|刘德华|黎明|郭富城", $ListView1)
GUICtrlCreateListViewItem("张飞3|赵云|关羽|刘备", $ListView1)
$label = GUICtrlCreateLabel("搜索内容:", 25, 174, 100, 25)
$input = GUICtrlCreateInput("张飞", 80, 170, 100, 25)
$Button = GUICtrlCreateButton('开始搜索', 200, 170, 90, 25)
$input = GUICtrlCreateInput("", 2, 200, 100, 25)
$input = GUICtrlCreateInput("", 2, 230, 100, 25)
$input = GUICtrlCreateInput("", 2, 260, 100, 25)
$input = GUICtrlCreateInput("", 2, 290, 100, 25)
GUISetState()
$n = 0
While 1
        $Msg = GUIGetMsg()
        Select
                Case $Msg = $GUI_EVENT_CLOSE
                        Exit
                Case $Msg = $Button
                        $Index = _GUICtrlListView_FindInText($ListView1, GUICtrlRead($input), $n)
                        If $Index < $n Then
                                MsgBox(0, 0, '搜索完毕')
                                $n = 0
                        Else
                                $n = $Index
                                setinput()
                        EndIf
        EndSelect
WEnd

Func WM_NOTIFY($hWndGUI, $MsgID, $WParam, $LParam)
        Local $tagNMHDR, $Event, $hWndFrom, $IDFrom
        Local $tagNMHDR = DllStructCreate("int;int;int", $LParam)
        If @error Then Return $GUI_RUNDEFMSG
        $IDFrom = DllStructGetData($tagNMHDR, 2)
        $Event = DllStructGetData($tagNMHDR, 3)
        $tagNMHDR = 0
        Switch $IDFrom;选择产生事件的控件
                Case $ListView1
                        Switch $Event; 选择产生的事件
                                Case $NM_CLICK ; 左击
;~                                       ...
                                Case $NM_DBLCLK ; 双击
                                        $Index = _GUICtrlListView_GetSelectedIndices($ListView1); 获取被选的索引
                                        If Not StringLen($Index) Then; 判断是否选定Item
                                                MsgBox(0, "", "未选定")
                                                Return
                                        EndIf
                                        setinput()
                                Case $NM_RCLICK ; 右击
;~                                       ...
                        EndSwitch
        EndSwitch
        Return $GUI_RUNDEFMSG
EndFunc   ;==>WM_NOTIFY


Func setinput()
        $aItem = _GUICtrlListView_GetItemTextArray($ListView1, Number($Index))
        For $i = 1 To $aItem
                GUICtrlSetData($input[$i], $aItem[$i])
        Next
EndFunc   ;==>setinput
关键:
_GUICtrlListView_FindInText和变量$Index 与 $n对比判断
解决问题:
输入关键字‘飞’或‘张飞’,点击开始搜索
第一次点击,含关键字的第一个字段自动读取各INPUT
再点搜索,提取下一个含关键字的字段自动读取各INPUT
...如此循环
直到最后一个则提示搜索完毕

andersonljw 发表于 2010-5-26 18:59:46

出差了几天,回来一看,真好,谢谢狼兄。真是越来越痴迷AUTOIT
谢谢大侠。

andersonljw 发表于 2010-5-26 19:00:51

版主麻烦将此贴结掉。谢谢

yejier 发表于 2010-5-26 20:46:04

顶贴、回帖、拿分、走人!url

lllangxx 发表于 2010-6-6 11:35:51

请问lynfr8一下你发的代码中变量怎么不用声明就可以用啊
{:face (396):}

lynfr8 发表于 2010-6-6 15:42:40

请问lynfr8一下你发的代码中变量怎么不用声明就可以用啊
lllangxx 发表于 2010-6-6 11:35 http://www.autoitx.com/images/common/back.gif变量的声明
AutoIt 中使用关键字 Dim, Local 和 Global 来声明并创建变量:
Dim $var1

还可以像下面这样一次声明多个变量:
Dim $var1, $myvariable

另外还可以不先声明某个变量而直接对其赋值, 但最好还是声明一下.
$var1 = "abc123"

lllangxx 发表于 2010-6-6 17:47:11

可是上面的代码中你只声明的几个变量
如$n = 0
$ListView1
$Msg
$WM_NOTIFY
这些都没有进行声明,运行却正常这是怎么回事
页: [1] 2
查看完整版本: 请问listview中每行如何读取到input控件中,急用,谢谢!!