3月192015
ListView 单元格实时编辑
#include <GUIConstantsEx.au3> #include <ListViewConstants.au3> #include <WindowsConstants.au3> #include <GuiListView.au3> ;2011.11.09 by bbs.wglm.net 小A 修改至:yhxhappy ;[修改] 代码精简,简单易懂 ;[增加] 支持回车换行,支持TAB换行.支持多项子项原位修改 ;[增加] 按回车listview跳到最后一行时,自动滚动listview例表 $Form1 = GUICreate("LIST原位编辑支持子项 支持回车换行 by 小A", 1166, 709) GUISetFont(9, 400, 0, "Arial") $ListView1 = GUICtrlCreateListView("1|2|3|4|5|6|7", 8, 8, 1153, 697) GUICtrlSendMsg($ListView1, $LVM_SETEXTENDEDLISTVIEWSTYLE, $LVS_EX_GRIDLINES, $LVS_EX_GRIDLINES);扩展风格 For $i = 0 To 9 GUICtrlSendMsg(-1, $LVM_SETCOLUMNWIDTH, $i, 150) Next $label = GUICtrlCreateLabel("", -100, -100,1,1) Dim $AccelKeys[2][2] = [["{Enter}", $label],["{TAB}", $label]] GUISetAccelerators($AccelKeys) GUISetState(@SW_SHOW) Global $Input, $oIndex = -1, $iIndex = -1, $OSubItem = -1 , $iSubIndex = -1 For $i = 0 To 120 GUICtrlCreateListViewItem("A" & $i & "|b" & $i & "|C" & $i & "|D" & $i & "|E" & $i & "|F" & $i & "|G" & $i, $ListView1) Next ;~ MsgBox(0,'', _GUICtrlListView_GetCounterPage($ListView1)) While 1 $nMsg = GUIGetMsg() Switch $nMsg Case $GUI_EVENT_CLOSE Exit Case $label _Enterkey() Case $GUI_EVENT_PRIMARYUP $InputState = ControlCommand($Form1, "", $Input, "IsVisible") $InputText = GUICtrlRead($Input) $Pos = GUIGetCursorInfo($Form1) Local $aHit $aHit = _GUICtrlListView_SubItemHitTest(GUICtrlGetHandle($ListView1)) _GUICtrlListView_SetItemSelected($ListView1, $aHit[0], False, False) ;使LV内所有行失去焦点 If ($aHit[0] <> -1) And (($aHit[0] <> $iIndex) Or ($aHit[1] <> $iSubIndex)) Then $CPos = ControlGetPos($Form1, "", $ListView1) $xy = _GUICtrlListView_GetSubItemRect($ListView1, $aHit[0], $aHit[1]) $text = _GUICtrlListView_GetItemText($ListView1, $aHit[0], $aHit[1]) ;读取所点击单元格的文本 If $OSubItem <> $aHit[1] Or $oIndex <> $aHit[0] And $InputState = 1 Then ;如果列或行不与上一次相等,说明点的是新行或新列 _GUICtrlListView_SetItemText($ListView1, $oIndex, $InputText, $OSubItem) GUICtrlDelete($Input) EndIf If $Pos[4] = $ListView1 Then $Input = GUICtrlCreateInput($text, $xy[0] + $CPos[0] + 4, $xy[1] + $CPos[1] + 2, _GUICtrlListView_GetColumnWidth($ListView1, $aHit[1]) - 2, $xy[3] - $xy[1]) ;创建一个与单元格差不多大小的输入框 GUICtrlSetState(-1, $GUI_ONTOP + $GUI_FOCUS) ;使输入框具有焦点及置顶 $OSubItem = $aHit[1] $oIndex = $aHit[0] ;新的项目索引 EndIf EndIf EndSwitch WEnd Func _EnterKey() $InputState = ControlCommand($Form1, "", $Input, "IsVisible") $InputText = GUICtrlRead($Input) If $InputState = 1 Then ;鼠标不在LV上,也不是输入框上,而且输入框存在,则更新单元格数据 ; 项目索引 子项的索引 _GUICtrlListView_SetItemText($ListView1, $oIndex, $InputText, $OSubItem) ;更改子项文本 GUICtrlDelete($Input) If $oIndex < _GUICtrlListView_GetItemCount($ListView1) - 1 Then _Enter() EndIf EndFunc ;==>_EnterKey ;按回车自动跳行 Func _Enter() $CPos = ControlGetPos($Form1, "", $ListView1) $oIndex += 1 $text = _GUICtrlListView_GetItemText($ListView1, $oIndex, $OSubItem) ;获取子项文本 If $oIndex >= _GUICtrlListView_GetCounterPage($ListView1) Then ;计算在可视区域中,垂直显示的项目数量. _GUICtrlListView_EnsureVisible($ListView1,$oIndex + 1);确保列表视图项目全部或部分可见 EndIf $xy = _GUICtrlListView_GetSubItemRect($ListView1, $oIndex, $OSubItem) ;读取所点击行,第1个单元格的框坐标 $Input = GUICtrlCreateInput($text, $xy[0] + $CPos[0] + 4, $xy[1] + $CPos[1] + 2, _GUICtrlListView_GetColumnWidth($ListView1, $OSubItem) - 2, $xy[3] - $xy[1]) ;创建一个与单元格差不多大小的输入框 GUICtrlSetState(-1, $GUI_ONTOP + $GUI_FOCUS) ;使输入框具有焦点及置顶 EndFunc ;==>_Enter```
本文固定链接: http://jianyiit.com/post-78.html
扫描二维码,在手机上阅读
木有头像就木JJ啦!还木有头像吗?点这里申请属于你的个性Gravatar头像吧!
厉害,学习了 ~