支持插入、添加、删除的PyGridTableBase子类

网格控件是用以显示一个二维的数据集的。要使用该控件显示有用的信息,你需要告诉该控件它工作所基于的是什么数据。在wxPython中,有两种不同的机制用于在网格控件中处理数据,它们之间在处理数据的添加,删除和编辑的方式上有些许的不同。

  
  
  
  
  • 网格控件可以直接处理每行和每列中的值。
  • 数据可以通过使用一个网格表(grid table)来间接地处理
我们要讨论正是第二种方式,至于如何实现的细节,这里不再赘述(网上已经有很多例子了),只简单讲些主要步骤:
  • 创建wx.grid.PyGridTableBase的子类,并覆盖父类的一些方法。
  • 通过SetTable方法绑定上面实现的子类和Grid。

如果网格是使用CreateGrid()方法被初始化的,那么网格的InsertRows、DeleteRows等方法总是可以工作的,并且在新的行或列中创建的单元格是以一个空字符串从为初始值的。如果网是使用SetTable()方法被初始化的,那么网格表必须支持对表的改变。要支持改变,你的网格表(PyGridTableBase的子类)要对同样的改变方法进行覆盖。例如,如果你对你的网格调用了InsertCols()方法,那么网格表也必须声明一个InsertCols(pos=0, numCols=1)方法。该网格表的这个方法返回布尔值True表示支持改变,返回False则否决改变。

下面以覆盖InsertRows方法为例,其中“self.data”为列表(list),每个元素都是一个字典,实现步骤如下:

    
    
    
    
  • 添加一个元素(即newData),其内容赋值为空,然后添加到数据变量中(即self.data)
  • 创建一个插入消息(GRIDTABLE_NOTIFY_ROWS_INSERTED),并赋值;用来通知网格有新数据插入(类似mfc里面的postmessage,或者sendmessage)
  • 创建一个查询消息(GRIDTABLE_REQUEST_VIEW_GET_VALUES),用来通知网格查询并显示新数据。

def InsertRows(self,pos=1,numRows=1):

""""""
for num in range(0,numRows):
newData={};
newData[u'lable'] = u''
self.data.insert(pos,newData)

gridView = self.GetView()
gridView.BeginBatch()
insertMsg = wx.grid.GridTableMessage(self,wx.grid.GRIDTABLE_NOTIFY_ROWS_INSERTED,pos,numRows)
gridView.ProcessTableMessage(insertMsg)
gridView.EndBatch()
getValueMsg = wx.grid.GridTableMessage(self,wx.grid.GRIDTABLE_REQUEST_VIEW_GET_VALUES)
gridView.ProcessTableMessage(getValueMsg)

return True


def AppendRows(self,numRows=1):
        """"""
        for num in range(0,numRows):
            newData={};
            newData[u'lable'] = u''         
            self.data.append(newData)
        self.isModified = True
        gridView = self.GetView()
        gridView.BeginBatch()
        appendMsg = wx.grid.GridTableMessage(self,wx.grid.GRIDTABLE_NOTIFY_ROWS_APPENDED,numRows)
        gridView.ProcessTableMessage(appendMsg)
        gridView.EndBatch()
        getValueMsg = wx.grid.GridTableMessage(self,wx.grid.GRIDTABLE_REQUEST_VIEW_GET_VALUES)
        gridView.ProcessTableMessage(getValueMsg)
        
        if self.onGridValueChanged:
            self.onGridValueChanged()  
            
        return True
    
    def DeleteRows(self,pos=0,numRows=1):
        if self.data is None or len(self.data) == 0:
            return False


        for rowNum in range(0,numRows):
            self.data.remove(self.data[pos+rowNum])
        
        gridView = self.GetView()
        gridView.BeginBatch()
        deleteMsg = wx.grid.GridTableMessage(self,wx.grid.GRIDTABLE_NOTIFY_ROWS_DELETED,pos,numRows)
        gridView.ProcessTableMessage(deleteMsg)
        gridView.EndBatch()
        getValueMsg = wx.grid.GridTableMessage(self,wx.grid.GRIDTABLE_REQUEST_VIEW_GET_VALUES)
        gridView.ProcessTableMessage(getValueMsg)
  
        if self.onGridValueChanged:
            self.onGridValueChanged()
            
        return True

或者可以从这里下载比较完整的代码(因为有些代码不能放上来,所以做了点修改。应该不影响使用或参考):
http://download.csdn.net/detail/ryanzll/4512964

你可能感兴趣的:(工作,list,table,mfc,wxPython)