Kevin Lynx BLOG

让wxListCtrl支持子item编辑

Aug7th, 20121:48 pm

我使用的wxLua版本信息为wxLua 2.8.7.0 built with wxWidgets 2.8.8，也就是LuaForWindows_v5.1.4-40.exe这个安装包里自带的wxLua。我不知道其他wxWidgets版本里wxListCtrl怎样，但我使用的版本里wxListCtrl是不支持编辑里面的子item的。在我使用的report模式下，子item也就是特定某一行一列的item。

google了一下，发现悲剧地需要自己实现，主要就是自己显示一个wxTextCtrl：

---- file: wxListCtrlTextEdit.lua-- author: Kevin Lynx-- date: 08.06.2012--localEditList={}-- get the column by an abs pointfunctionEditList:getColumn(x)localcols=self.listctrl:GetColumnCount()localcx=0fori=0,cols-1dolocalw=self.listctrl:GetColumnWidth(i)ifx<=cx+wthenreturniendcx=cx+wendreturn-1end-- when a mouse down, show a text edit control functionEditList:onLeftDown(evt)ifself.editor:IsShown()thenself:closeEditor()endlocalp=evt:GetPoint()localrow=evt:GetIndex()localcol=self:getColumn(p.x)localrect=wx.wxListCtrlEx.GetSubItemRect(self.listctrl,row,col)rect:SetHeight(rect:GetHeight()+5)-- adjustself.editor:SetSize(rect)self.editor:Show()self.editor:SetValue(wx.wxListCtrlEx.GetItemText(self.listctrl,row,col))self.editor:SetFocus()self.col=colself.row=rowendfunctionEditList:closeEditor()ifnotself.editor:IsShown()thenreturnendself.editor:Hide()self.listctrl:SetItem(self.row,self.col,self.editor:GetValue())endfunctionEditList:initialize()self.editor=wx.wxTextCtrl(self.listctrl,wx.wxID_ANY,"",wx.wxDefaultPosition,wx.wxDefaultSize,wx.wxTE_PROCESS_ENTER+wx.wxTE_RICH2)self.editor:Connect(wx.wxEVT_COMMAND_TEXT_ENTER,function()self:closeEditor()end)-- not work actuallyself.editor:Connect(wx.wxEVT_COMMAND_KILL_FOCUS,function()self:closeEditor()end)self.editor:Hide()endfunctionwx.wxListCtrlTextEdit(listctrl)localo={listctrl=listctrl,editor=nil,}localeditlist=newObject(o,EditList)editlist:initialize()listctrl:Connect(wx.wxEVT_COMMAND_LIST_ITEM_RIGHT_CLICK,function(evt)editlist:onLeftDown(evt)end)listctrl:Connect(wx.wxEVT_COMMAND_LIST_ITEM_FOCUSED,function()editlist:closeEditor()end)returnlistctrlend