以文本方式查看主题

-  Foxtable(狐表)  (http://foxtable.net/bbs/index.asp)
--  专家坐堂  (http://foxtable.net/bbs/list.asp?boardid=2)
----  关于Table(Normal,副本)、SqlTable,与DataList 的初步对比!  (http://foxtable.net/bbs/dispbbs.asp?boardid=2&id=4052)

--  作者:cpayinyuan
--  发布时间:2009/8/26 10:11:00
--  关于Table(Normal,副本)、SqlTable,与DataList 的初步对比!

    贺老师一直说现在的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编辑过]

--  作者:狐狸爸爸
--  发布时间:2009/8/26 10:19:00
--  
呵呵,回答两个问题:

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

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

--  作者:cpayinyuan
--  发布时间: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编辑过]

--  作者:狐狸爸爸
--  发布时间:2009/8/26 10:52:00
--  
作为SQLTable和SQLQuery的时候,就是一个独立的控件,有自己的独立事件。
作为副本的时候,事件没有办法完全独立的,大部分事件,例如DataColChanged事件,针对的时DataTable,而不是Table。
有些事件,虽然针对的时Table,例如DrawCell,但实际上同一DataTable的Table都是一样的。

至于加载数据,确实没有什么好讨论的。
--  作者:狐狸爸爸
--  发布时间:2009/8/26 11:00:00
--  

如果副本的事件独立的话,意味着很多事件要写两次甚至更多了,例如DrawCell事件。


--  作者:reachtone
--  发布时间:2009/8/26 11:00:00
--  
以下是引用cpayinyuan在2009-8-26 10:11:00的发言:

   1、以前的时候DataList中定位当前行需要使用FindRow和行号,但在新版的Table中,对此没有作出任何改进,甚至还没有以前方便!不知贺老师能否把定位当前行功能变得自动化一点,让表Table的当前行自动随Table控件的当前行移动
  
   2、目前的系统还有一个很大的问题,就是SQLTable中的Table只有在窗口打开的时候才存在,窗口关闭的时候就不存在了,而在窗口打开的时候,当前表的操作可能会引用其他的表(例如编辑表A时可能要引用表B),而其他的表(表B)如果在项目启动时没有加载,表B虽然在其他窗口中加载Table但其他窗口没有打开,所以这时候就不能引用其他的表(表B)。

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


--  作者:reachtone
--  发布时间:2009/8/26 11:05:00
--  
以下是引用cpayinyuan在2009-8-26 10:32:00的发言:

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

为什么要一下子增加这么多sqltable呢?一个就够啊。
比如,我现在做的一个录入窗口,里面有很多的编辑框。当焦点进入到不同的编辑框时,就将这个窗口中table控件的内容进行动态调整(赋予不同的sql语句就行了)。我将这个table控件是作为选项列表来使用的,进入不同的编辑框,table就生成不同的列表项目。一个table就够了。


--  作者:blackzhu
--  发布时间:2009/8/26 11:09:00
--  
以下是引用reachtone在2009-8-26 11:05:00的发言:

为什么要一下子增加这么多sqltable呢?一个就够啊。
比如,我现在做的一个录入窗口,里面有很多的编辑框。当焦点进入到不同的编辑框时,就将这个窗口中table控件的内容进行动态调整(赋予不同的sql语句就行了)。我将这个table控件是作为选项列表来使用的,进入不同的编辑框,table就生成不同的列表项目。一个table就够了。

  老大好高深哦,做个列子看看嘛.


--  作者:狐狸爸爸
--  发布时间:2009/8/26 11:10:00
--  
将副本型Table最常用的三个事件CurrentChanged、PositionChnged、DoubleClick独立出来,其余和原本共享。

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

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

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