Foxtable(狐表)用户栏目专家坐堂 → 关于Table(Normal,副本)、SqlTable,与DataList 的初步对比!


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

主题:关于Table(Normal,副本)、SqlTable,与DataList 的初步对比!

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


加好友 发短信 一级勋章
等级:六尾狐 帖子:1412 积分:8937 威望:0 精华:0 注册:2008/9/1 8:57:00
关于Table(Normal,副本)、SqlTable,与DataList 的初步对比!  发帖心情 Post By:2009/8/26 10:11:00 [显示全部帖子]

    贺老师一直说现在的Table无论从哪方面说都超过以前的DataList,所以,这两天我对Table控件进行了简单试用,我把我的感觉,不管是好的,还是不好的,公平的评价一下:
   1、目前的Table(Normal,副本),其功能和以前的DataList基本上一样。但有一个明显的不一样的地方,就是,以前的DataList的属性和事件直接在窗口中设置,但现在不管是哪个窗口的Table,都共享表Table 的同一属性和事件,并通过表名来设置不同窗口中的属性或不同窗口中的事件。
    在实际应用中,同一窗口可能动态加载不同的表。以前的时候,不管DataList 加载哪个表,都在窗口中设置DataList控件的属性和事件,既直观又方便快捷!但是,在新的Table控件中,设置Table控件的各种事件,不能在窗口中直接设置,必须回到各个表中,根据表名设置窗口控件的事件,既浪费时间、不方便,而且也名不正言不顺。窗口控件的事件本身就应该在窗口中设置,但现在还要迂回到表中进行设置,估计没有人感觉这个很顺手吧!在实际中,有可能一个表被许多个窗口来引用,我们增加一个窗口后(假如引用了表A),不能在窗口中设置这个Table控件的事件,需要回到表Table中重新设置事件;再增加一个窗口(假设又引用了表A),仍然还要回到表Table中重新设置事件。而且,在表Table中设置事件时,还要记忆并引用表中的控件的名字(类似于 窗口1_Table1这样的名字),不能直接使用e参数,也不太方便。
     总之,我认为目前的Table控件的确与DataList功能重复,但是,操作方式不如DataList方便。如果可能的话,建议改回DataList 以前的那种操作方式。
     另外,其他贴子中已经说过了,以前的时候DataList中定位当前行需要使用FindRow和行号,但在新版的Table中,对此没有作出任何改进,甚至还没有以前方便!不知贺老师能否把定位当前行功能变得自动化一点,让表Table的当前行自动随Table控件的当前行移动
  
   2、我认为SQLTable是一个真正的创举,具有一定的跨时代的意义。因为它可以直接从后台数据库加载表并生成Table和DataTable,而且生成的Table可以有自己的事件。几个月前,我曾多次建议可以动态加载Table,即利用代码直接从后台数据库生成Table和DataTable,贺老师一直没有采纳,现在借助SQLTable基本上实现了这个功能。以前的版本中,所有的Table必须在项目中先加载才能使用,在项目打开的时候至少必须加载一个空表,所以以前的动态加载表名不副实。我以一个项目中,大概有60多个表,项目打开的时候,即使加载这60多个空表,也需要4分钟左右的时间,启动太慢。如果以后改用SQlTable,所有表都在窗口中加载,那么,启动速度会成倍提高,占用系统资源也会成倍减少。但是,要把目前的表全部改成SQLTable,目前的系统还有一个很大的问题,就是SQLTable中的Table只有在窗口打开的时候才存在,窗口关闭的时候就不存在了,而在窗口打开的时候,当前表的操作可能会引用其他的表(例如编辑表A时可能要引用表B),而其他的表(表B)如果在项目启动时没有加载,表B虽然在其他窗口中加载Table但其他窗口没有打开,所以这时候就不能引用其他的表(表B)。
     我不太清楚reachtone老师是怎么解决这个问题的,我的建议是:对系统稍作改进,让SQLTable中动态生成的表,在窗口关闭的时候也能可见(或者换个说法,窗口不打开不显示,但就像窗口打开时一样让窗口中的Table可用);或者提供另外一种办法也行:让系统增加一个功能,可以利用代码直接从后台数据库生成Table 和DataTable。如果这个问题真正解决了,对狐表设计软件时的动态加载数据,将是一个彻底的革命!

   

[此贴子已经被作者于2009-8-26 10:16:31编辑过]

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


加好友 发短信 一级勋章
等级:六尾狐 帖子:1412 积分:8937 威望:0 精华:0 注册:2008/9/1 8:57:00
  发帖心情 Post By:2009/8/26 10:32:00 [显示全部帖子]

以下是引用狐狸爸爸在2009-8-26 10:19:00的发言:
呵呵,回答两个问题:

1、来自同一个DataTable的Table,自然应该有相同的事件,因为表事件有的是针对Table的,有的是针对DataTable的。
2、我没有感觉新版本的定位比原来不方便,我只觉得更方便,至少也是一样的吧。

其他问题或者建议,我是没有办法回答的。
[此贴子已经被作者于2009-8-26 10:19:28编辑过]

     关于1,不太明白,贺老师总是误导大家一个问题: Table控件=Table表。实质上,不是我说还是你说它是两个东西,它本来就是两个完全不同的对象,一个是可见的表,一个是窗口控件。从道理上来讲,表是表、控件是控件,表的属性和事件应该在表中设置,控件的属性和事件应该在窗口中进行设置。不太明白,贺老师是专家,为什么非要故意把两个完全示同的东西搅到一起,让大家把概念搞混呢?区分开,既清楚,又方便快捷,有什么不好呢?对于新用户来说,DataTable 和Table的概念已经让很多人头痛了,现在你再把Table 控件搅起来和表放在一起划等号,会把新用户吓跑的!?

      关于动态加载的问题,我认为以前版本中的动态加载根本起不到应用的作用,即使所有表都加载空表,我以前的项目启动需要3-5分钟,如果全部改为SQlTable,启动速度可以加快若干倍。不知是否我没有把问题说明白,我提的关于动态加载Table的建议有什么不对吗?

     或者现在可以用这样的变通办法来解决:在一个窗口中,增加多个SQLTable 控件,把所有可能用到的Table都加载进来?

[此贴子已经被作者于2009-8-26 10:36:26编辑过]

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


加好友 发短信 一级勋章
等级:六尾狐 帖子:1412 积分:8937 威望:0 精华:0 注册:2008/9/1 8:57:00
  发帖心情 Post By:2009/8/26 11:16:00 [显示全部帖子]

以下是引用狐狸爸爸在2009-8-26 11:10:00的发言:
将副本型Table最常用的三个事件CurrentChanged、PositionChnged、DoubleClick独立出来,其余和原本共享。

       是不是把这3个事件直接在窗口进行设置,独立于Table?如果是这样,强烈支持!
      

[此贴子已经被作者于2009-8-26 11:18:12编辑过]

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


加好友 发短信 一级勋章
等级:六尾狐 帖子:1412 积分:8937 威望:0 精华:0 注册:2008/9/1 8:57:00
  发帖心情 Post By:2009/8/26 11:26:00 [显示全部帖子]

以下是引用reachtone在2009-8-26 11:00:00的发言:

2、如果表B需要在窗口中显示,就是动态的table,一条sql语句就可以;如果不需要显示而只是调用数据,可以用sqlcommand的ExecuteReader方法。调用没有加载的表可以很自如啊。


1、用SQLcommand好像只能产生Datatable,不能产生Table,但有时候是需要Table的,这个目前不好解决。
2、大量使用SQLTable还有一个障碍需要解决,我发现输入框只能绑定打开项目时加载的Table中的字段,不能绑定窗口中SqlTable中动态生成的Table中的字段,不知这个怎么解决?如果全部用代码读入写出,工作量比较大,另外还涉及到输入框之前的相互计算问题,以前在Datacolchanged事件中设置,输入框绑定字段后仍然有效,如果用代码写入,Datacolchanged事件中的计算关系不会对输入框产生效果,这个怎么解决?


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


加好友 发短信 一级勋章
等级:六尾狐 帖子:1412 积分:8937 威望:0 精华:0 注册:2008/9/1 8:57:00
  发帖心情 Post By:2009/8/26 11:30:00 [显示全部帖子]

以下是引用cpayinyuan在2009-8-26 11:26:00的发言:


1、用SQLcommand好像只能产生Datatable,不能产生Table,但有时候是需要Table的,这个目前不好解决。
2、大量使用SQLTable还有一个障碍需要解决,我发现输入框只能绑定打开项目时加载的Table中的字段,不能绑定窗口中SqlTable中动态生成的Table中的字段,不知这个怎么解决?如果全部用代码读入写出,工作量比较大,另外还涉及到输入框之前的相互计算问题,以前在Datacolchanged事件中设置,输入框绑定字段后仍然有效,如果用代码写入,Datacolchanged事件中的计算关系不会对输入框产生效果,这个怎么解决?

     这两个问题不知reachtone老兄是怎么解决的?或者贺老师能够提供好的解决方案。其实当数据量很大的时候,动态加载数据是一个很重要的大事,以前的版本中当表比较多时启动太慢,每次都启动5分钟左右,谁能受得了,以前的时候我一直没有想到好的解决办法,现在似乎看到一些希望了。


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


加好友 发短信 一级勋章
等级:六尾狐 帖子:1412 积分:8937 威望:0 精华:0 注册:2008/9/1 8:57:00
  发帖心情 Post By:2009/8/26 11:48:00 [显示全部帖子]

   1、12楼的例子我看过了。但在有时候,需要在某窗口中编辑表A时,同时引用表B,或者表A的数据变化时需要对表B的数据进行修改。这时候,必须存在多个Table,而且要执行多个Table  的DataColchanged事件,只用SQLCommand加载DataTable是不行的。

   2、楼上说输入框写到表中后还会执行Datacolchanged 事件的,所以,计算关系的事不影响。事实上,没有这么简单,例如在编辑某个人的工资时,输入 销售额时需要马上看到它的提成工资,修改基本工资时需要马上看到应发工资发生了变化。以前的时候直接绑定字段,直接就可以实现这样的效果。如果是用代码在输入框和字段之间交换数据,DataColchanged事件不会对输入框产生影响,所以,就不得不再重复写一次列间计算关系的代码(写入输入框的计算关系,或者全局变量的计算关系),这等于是一模一样的计算关系重复写了两次代码。

   3、如贺老师所说,几百个输入框也只需要几个代码。实际上,也没有这么简单。在一个编辑窗口中,可能有的输入框需要写入字段,有的不需要写入,如果好多个输入框用短短的几行代码用循环来实现,我明白这个思路,但对于一些特殊情况是没有办法处理的。

        由于上述的2、3个原因,尤其是第2个原因,需要设置两次重复的代码(一次是Datacolchanged事件,一次是输入框间的计算关系),不但会增加额外工作量,而且,相同的计算关系计算两次,显得比较混乱。

        我对reachtone老兄说的有点心动,我的项目表很多,启动慢得谁都无法忍受,项目项动时不加载表,对我的诱惑太大了!所以,希望贺老师一定想想办法,让输入框能够绑定 SqlTable中动态生成的表?(贺老师先别忙着否定,相信您一定会有办法的!)

[此贴子已经被作者于2009-8-26 14:11:40编辑过]

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


加好友 发短信 一级勋章
等级:六尾狐 帖子:1412 积分:8937 威望:0 精华:0 注册:2008/9/1 8:57:00
  发帖心情 Post By:2009/8/26 13:10:00 [显示全部帖子]

以下是引用cpayinyuan在2009-8-26 11:48:00的发言:

        由于上述的2、3个原因,尤其是第2个原因,需要设置两次重复的代码(一次是Datacolchanged事件,一次是输入框间的计算关系),不但会增加额外工作量,而且,相同的计算关系计算两次,比较混乱。

        我对reachtone老兄说的有点心动,我的项目表很多,启动慢得谁都无法忍受,项目项动时不加载表,对我的诱惑太大了!所以,希望贺老师一定想想办法,让输入框能够绑定 SqlTable中动态生成的表^

[此贴子已经被作者于2009-8-26 11:52:02编辑过]

         经过认真分析,之所以不能以可视化的方式,让输入框绑定到Sqltable的字段,是因为SQLtable中的表是从属于窗口中的,而且SQLtable中的table是动态生成的,在没有打开窗口之前,并不知道这个Table是什么,也知不知道它有字段,所以,也就无法让输入框绑定未知的字段。

        基于上述情况,我建议这样解决:给窗口中的 所有输入框类控件(例如文字框、数字组合框、组合框、日期框等),系统都 增加一个 “方法”,这个方法的功能是:用代码来设置当前输入框控件绑定的字段。以前的时候,所有输入框与字段(或全局变量)的绑定都是可视化进行的,现在增加了一个用代码把输入框与字段绑定的功能!这样,当打开编辑窗口的时候,可以在窗口的 AfterLoad 事件中利用此方法,用代码把输入框与字段绑定起来(可以是SQlTable中的Table的字段,或者其他Table的字段都可以),即完美的达到了我们的所有目的!这样一来,reachtone老兄提出的,在打开项目时不加载任何表的设想就可以真正实现了!
       望贺老师认真考虑!


 回到顶部