wzzlfok 发表于 2012-1-17 11:46:00

ActiveX FlexGrid 绑定数据库后如何自动显示行号

Studio for ActiveX 的 FlexGrid控件用ADO数据绑定后,能显示数据,也很快,
请问怎么自动显示行号,就像SQL Server 查询分析器一样,加载完后,最左边自动显示行号

是提供数据源后自动显示的哦,不是用循环来显示的。如果是用循环的话,数据绑定这个名词就没有意义了。

gw0506 发表于 2012-1-17 14:43:00

一种办法:你在数据库中插入一列编号,绑定后可以显示。

另一种办法:通过代码手动添加序号。这肯定要用循环了。
            for (int i = 1; i < this.axVSFlexGrid1.Rows; i++)
            {
                this.axVSFlexGrid1.set_TextMatrix(i, 0, i.ToString());
            }

wzzlfok 发表于 2012-1-18 04:05:00

第二种方法就不说了,这个谁都知道的。
我最近评估了10几个表格,发现 ActiveX FlexGrid 在数据绑定方面做的是做好的,快而简单,只要提供一个数据源就可以了。如果只能用循环来增加行号的话,我个人认为就违背的ActiveX FlexGrid 的数据绑定这个意义了,什么表格都能实现。既然循环显示行号了,那就直接在循环体里面把记录集的内容都给显示了,不就得了吗?还用什么数据绑定啊。现在我想说说第一个方法

你说在数据库加一个列,
我想了一下,如果是数据库建立的时候直接加入行号列也不能做到行号的显示啊,如果用自动递增的ID,那万一在工作中删除了一行内容,那么这个ID编号就空了,在做数据绑定的时候显示出来会缺少这个号码?

如果在查询语句里面增加一个临时ID编号,(我目前还不知道什么增加),您说会不会影响性能?我现在举个例子给您,请您帮我想个好的方案好吗?

我的表的名称:客户档案

结构:
客户编号       客户名称       地址      电话
000001          张三          一号街      010
000002          李四          二号街      020
000003          王五          三号街      030

查询语句:select * from 客户档案
直接返回整个表的信息,就是没有行号。你说的第一个方案,可以按照我这个表来写个代码给大家看一下吗?

还有我下面的帖子,关于货币符号的显示问题。我现在购买这个表格控件就是这2个问题的困扰,如果解决不了,我只能评估其他表格控件了,如果能解决那就直接购买了,货币符号的显示对我来说非常重要。希望您能帮助我解决一下,非常感谢您!

ZenosZeng 发表于 2012-1-18 18:30:00

回复 3# wzzlfok 的帖子

通过以下SQL语句在SQL Server中可以实现查询结果自动添加行号的功能:select row_number() over( order by 客户编号) as 行号,*
from 客户档案

wzzlfok 发表于 2012-1-19 02:40:00

row_number() over   这个函数是 SQL Server 2005 以上的。
我的程序的是 SQL Server 2000 的

ZenosZeng 发表于 2012-1-19 10:49:00

回复 5# wzzlfok 的帖子

根据上面讨论的过程来看,你需要的行号其实和业务数据无关,主要是为了便于查看数据,针对以上几种方法我提出以下几点看法:
1、上面提到的几种方法中,for循环的方法应该是代码最少、效率最好的实现,不会影响数据源的绑定
2、在数据源中直接添加行号的方法由于环境限制无法实现

在 VSFlexGrid 中还有一种方法可供参考,就是通过OwnerDraw来实现,OwnerDraw主要为了满足用户的自定义实现:
Private Sub Form_Load()
   
    ' 设置表格的自画方法
    VSFlexGrid1.OwnerDraw = flexODContent
   
    ' 设置表格的行数
    VSFlexGrid1.Rows = 21
   
End Sub


Private Sub VSFlexGrid1_DrawCell(ByVal hDC As Long, ByVal Row As Long, ByVal Col As Long, ByVal Left As Long, ByVal Top As Long, ByVal Right As Long, ByVal Bottom As Long, Done As Boolean)
   
    If Row >= VSFlexGrid1.FixedRows And Col = 0 Then
      VSFlexGrid1.TextMatrix(Row, 0) = Row
    End If
   
    '达到最大行之后就不就行重画
    If Row = (VSFlexGrid1.Rows - 1) Then
      VSFlexGrid1.OwnerDraw = flexODNone
    End If
   
End Sub

wzzlfok 发表于 2012-1-20 05:04:00

您说的很多,我需要的行号是和业务数据无关的,只是提供查看,那条数据是要的,能马上看出来。

方法一确实是最,效率最好的实现,不会影响数据源的绑定。但是问题很大啊。我测试了18340条数据,21个字段。直接数据源绑定只要500毫秒,结果是没有行号的,我再进行循环要花5秒钟,总的花了5.5秒。
虽然说比直接循环写出各个字段的内容要快很多。但是还是觉的很遗憾。如果直接提供数据源就有行号了,那是最好的。我刚才再打开葡萄城自己的产品 FpSPR80 好像是直接已经有行号了。

现在您可以把这个表格和葡萄城的 FpSPR80 表格做个对比吗?我刚才也测试了 FpSPR80 好像和 这个表格差不多的。FpSPR80甚至修改 这个表格的一些不足之处。

希望您能说说 FpSPR80 的优点,这样的话,能让我们减少时间去评估

wzzlfok 发表于 2012-1-20 05:06:00

还有,方法2 不可行,如果滚动条快速往下拉,行号会断号。刚开始的时候滚动条还不能拉呢,速度还真的快,几乎没有感觉到行号的生成。

gw0506 发表于 2012-1-20 10:44:00

总体来讲,FlexGrid的特点是简单高效,Spread的特点是功能强大,灵活性高。之前因为不确定您是选型阶段还是实际生产阶段,因此没有提出让您改用Spread进行评估的建议。

就目前你提出的两个问题,一个是行号,一个是货币符号。

Spread都可以满足。spread默认提供了类似Excel的界面,行号是自动计算和显示的。包括您在删除和添加行时,行号也会自动计算不需要人工干预。也不会出现在快速托转滚动条时的断号问题。
关于货币符号。Spread提供了多种单元格用于匹配各种数据。其中包括Currency类型的单元格。可用于分别定制金额样式,最小粒度达到单元格级别。完全可以满足您不同列需要不同金额样式的需要。

下图为Spread8运行后的效果:


下图为Spread 8的设计器效果图

wzzlfok 发表于 2012-1-20 19:08:00

谢谢您的回答,我现在正在评估 Spread 8 ,得出结果,我跟帖说说我评估的结果
页: [1] 2
查看完整版本: ActiveX FlexGrid 绑定数据库后如何自动显示行号