Foxtable(狐表)用户栏目专家坐堂 → 另一种动态列表项目


  共有24683人关注过本帖树形打印复制链接

主题:另一种动态列表项目

帅哥哟,离线,有人找我吗?
狐狸爸爸
  1楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:管理员 帖子:47497 积分:251403 威望:0 精华:91 注册:2008/6/17 17:14:00
另一种动态列表项目  发帖心情 Post By:2009/3/19 23:30:00 [只看该作者]

如果某列列表项目需要根据另一列输入的内容而发生变化,那么就需要使用动态列表项目。

例如在A列内容"值1"的时候,B列的列表项目为"项目1|项目2",如果A列内容等于"值2"时,B列的列表项目等于“项目3|项目4”,为此我们可以在PrepareEdit事件中加入如下代码:


If
e.Col.Name = "第二列" Then
    Select
Case e.Row("第一列")
        Case
"值1"
            e.Col.ComboList =
"项目1|项目2"
       
Case "值2"
            e.Col.ComboList =
"项目3|项目4"
   
End Select
End
If


代码的原理很简单,首先判断编辑的是否是第二列,如果是的,则根据第一列的值来设置不同的列表项目。

代码很简单,但是维护起来却不太方便了,因为如果要增加新的列表项目或者有新的要求,我们就必须重新修改代码,对于已经交付使用的系统,这可能是一个可怕的工作,可怕之处不在于修改代码,而在于逐个终端去更新程序。


所以最好的方式给最终的用户提供自行修改列表项目的功能,实现的步骤是:


1、新建一个表(假定表名为项目),包括两列,分别是“值”和“列表项目”,用于输入每个值及其对应的列表项目:



此主题相关图片如下:1009.gif
按此在新窗口浏览图片


2、然后在数据录入表的PreparEdit事件中设置如下代码:


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


代码的原理同样很简单,如果输入的是第二列的内容,那么就在项目表查找值等于输入行第一列内容的行,如果找到的话,将列表项目设为该行列表项目列的内容。

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


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



此主题相关图片如下:1010.gif
按此在新窗口浏览图片

 

2、然后在相关表的PrepareEdit事件中加入如下代码:

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


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

上面的代码简单实用,但是需要逐个表设置PrepareEdit事件代码,而且每次编辑单元格之前都去项目表检索一次,不管是编程效率,还是运行效率,都是比较低的。
我们可以删除PrepareEdit事件中的代码,而是在项目事件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


这样修改项目表中的列表项目后,无需重新打开项目即可生效,同时编程效率和运行效率也比较高。


一个小技巧:


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



此主题相关图片如下:1011.gif
按此在新窗口浏览图片

[本帖被加为精华]
 回到顶部
帅哥哟,离线,有人找我吗?
程兴刚
  2楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信 一级勋章
等级:超级版主 帖子:7258 积分:40773 威望:0 精华:16 注册:2008/8/31 23:23:00
  发帖心情 Post By:2009/3/19 23:51:00 [只看该作者]

顶,收藏!


 回到顶部
帅哥哟,离线,有人找我吗?
雪山飞狐
  3楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:婴狐 帖子:13 积分:166 威望:0 精华:0 注册:2008/9/20 14:02:00
  发帖心情 Post By:2009/3/20 0:20:00 [只看该作者]

 好贴。再顶。


 回到顶部
帅哥哟,离线,有人找我吗?
t_fs
  4楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:一尾狐 帖子:431 积分:2808 威望:0 精华:0 注册:2008/9/1 8:46:00
  发帖心情 Post By:2009/3/20 7:24:00 [只看该作者]

     学习并收藏!

 回到顶部
帅哥哟,离线,有人找我吗?
xysheng
  5楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:幼狐 帖子:53 积分:1698 威望:0 精华:0 注册:2008/8/31 21:43:00
  发帖心情 Post By:2009/3/20 7:51:00 [只看该作者]

学习收藏了,多谢!

 回到顶部
帅哥哟,离线,有人找我吗?
kylin
  6楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信 F6
等级:狐精 帖子:3036 积分:19229 威望:0 精华:2 注册:2008/9/1 7:50:00
  发帖心情 Post By:2009/3/20 8:24:00 [只看该作者]

收藏

 回到顶部
帅哥哟,离线,有人找我吗?
菜鸟foxtable
  7楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信 菜鸟中的老鸟
等级:七尾狐 帖子:1486 积分:10064 威望:0 精华:9 注册:2008/11/14 8:54:00
  发帖心情 Post By:2009/3/20 9:40:00 [只看该作者]

收藏

 回到顶部
帅哥哟,离线,有人找我吗?
mr725
  8楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信 一级勋章
等级:MVP荣誉狐 帖子:5154 积分:31434 威望:0 精华:8 注册:2008/9/8 12:27:00
  发帖心情 Post By:2009/3/20 10:59:00 [只看该作者]

不知道这样做能不能进行排序,当然,项目不多且不需排序的话,这样做非常好的。 最后的备注方法特好,简单省事!但若能将项目列表的形式动态转换成备注形态来使用更好(那位高手给做个代码参考参考就好),因为列表形式易于排序,对成百上千的项目易于管理。我是瞎想的,呵呵~

 回到顶部