动态列表项目之二

我们可以在上一节的基础上扩展一下,假定某些列的列表项目不是动态的,但是随着应用的深入,这些列的列表项目可能会需要调整,虽然通过列属性设置窗口,可以方便地重新设置列表项目。但是对于一个已经交付使用的系统来说,让最终用户可以随意设置列属性是有危险的,有没有安全一些的做法呢?有,通用的做法是:

1、新建一个表(假定表名为项目),包括三列,分别是表、列、列表项目,用于输入某表某列的列表项目:

2、然后在全局表事件PrepareEdit中加入如下代码:

If e.IsFocusCell Then
    Dim
dr As Datarow
    dr =
DataTables("项目").Find("[表] = '" & e.Table.Name & "' And [列] = '" & e.Col.Name & "'")
    If
dr IsNot Nothing '一定要判断是否存在对应的行
        e.Col.ComboList = dr(
"列表项目")
    End
If
End If

在项目事件Initialize加入代码,为所有的表开启全局表事件PrepareEdit:

For Each dt As DataTable In DataTables
    dt.GlobalHandler.
PrepareEdit = True
Next

这样在编辑任何一列之前,都会根据表名和列名,在项目表检查是否存在对应的行,如果找到,将列表项目设为该行列表项目列的内容。

上面的代码简单实用,但是每次编辑单元格之前都去项目表检索一次,运行效率是比较低的。

我们可以删除全局表事件PrepareEdit和项目事件Initialize中的代码,改为在项目事件AfterOpenProject中加入下面的代码:

Dim dt as DataTable = DataTables("项目")
Dim
dr As DataRow
For
Each t As Table In Tables
    For
Each c As Col In t.Cols
        dr = dt.Find(
"[表] = '" & t.DataTable.Name & "' And [列] = '" & c.Name & "'")
        If
dr IsNot Nothing Then
            c.ComboList = dr(
"列表项目")
        End
If
    Next
Next

这样在打开项目的时候,就会自动设置列表项目,这个设置是一次性的,所以运行效率要高很多;但是也有一个副作用,就是当你修改项目表的列表项目内容时,必须重新打开项目才会生效。
不过列表项目是不需要经常修改的,所以这不是一个大问题,如果你很在意的话,可以删除AfterOpenProject事件中的代码,改为在项目事件CurrentTableChanged中设置代码:

Dim dt as DataTable = DataTables("项目")
Dim
dr As DataRow
For
Each c As Col In CurrentTable.Cols
    dr = dt.Find(
"[表] = '" & CurrentTable.DataTable.Name & "' And [列] = '" & c.Name & "'")
   
If dr IsNot Nothing Then
        c.ComboList = dr(
"列表项目")
   
End
If
Next

这样修改项目表中的列表项目后,无需重新打开项目即可生效。

一个小技巧:

我们一直用符号“|”来分隔列表项目,其实是可以用换行符分开的,这样我们可以更方便地录入列表项目,例如下图将列表项目列改为备注型,每行录入一个。


本页地址:http://www.foxtable.com/webhelp/topics/1843.htm