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
扫描二维码,在手机上阅读

厉害,学习了 ~