K
kinneng
Unregistered / Unconfirmed
GUEST, unregistred user!
研发在 DBGrid 上完美地显示序号的方法
这个真是一个难题,虽然网上也有很多写明能够在 DBGrid 上显示序号的文章,结果但都是失
败的,老外的控件都没这功能,不要浪费时间找了。
1、使用 RecNo,但它是编号,不是序号,删数据之后,就不连续了,ADO 的 RecNo 例外。
2、使用 AutoInc 自动递增字段,同上删数据之后,也会不连续。
3、使用 CalcField 计算字段,做在控件里面,强加一个计算字段给用家。
4、增大用户数据集控件的缓冲器,将数据全部下载,变成内存表来计算序号,这是不
可取,为了避免影响用户的数据集控件,动态新建一个数据集控件来下载数据的方
法,就简直不知怎么形容。
5、用一个整数字段,每当增删除数据之后,历遍重新编一次号。
6、监视滚动条,但不是什么变化都触发滚动条事件。
7、改用 StringGrid 或者 ListView
1、2、6 是失败的。4、5 虽然可以取得正确序号,但消耗较大,效率较低。我认为只有 3 计算
字段这个方法消耗较少,而且正确,比较之下5的方法是很蠢的。7 在回避问题。
有些网友觉得显示序号很容易,就是用上面的其中一种,那别怪我不放在眼内,上面的 1~6 方
法有很多人不管出错没出错,效率如何就这么用了,也有商品软件用 7 方法,这些方法在论坛内
都有帖子和源代码,还炒来炒去。
要显示序号,先了解其难点,论坛的讨论认为主要是修改、插入或者添加数据的时候,RecNo
会变 -1,如果就这个简单,那就不是问题,问题是 RecNo 根本不能用。
那么冷静分析一下,除了 RecNo 外还有什么位置信息可以获得,表格本身有什么规律,规律
真是有的,例如:
1、数据总条数等于 0 的时候,表格第一行序号为 0,TopRowID:=0,既然它事实存在,就
不应该放过它,这条成立的话,Bof和Eof是什么状态,也不用管。
2、无论任何状态下,数据条数等于少于表格行数时,表格第一行序号恒为 1,其它的不管。
代码就是 if Dataset.RecordCount <= RowCount then TopRowID:=1;
3、Insert 插入数据状态下,行数增加,但表格序号不变,TopRowID 不变,不管它。
4、Append 添加数据状态下,先符合第2条,数据现在条数 +1 等于少于表格行数时,表格
第一行序号为 1,否则因为表格自动上滚一行,第一行序号要 +1。Inc(TopRowID);
5、光标垂直移动,翻页会触发滚动事件,滚动事件的 Distance 参数+第一行序号,就等于
滚动翻页后的新序号。TopRowID:=TopRowID+Distance;
数据集 First,Last 等操作提供 Bof 和 Eof 来定位。
6、Bof 等于真的时候,表格第一行序号恒为 1。
7、Eof 等于真的时候,表格第一行序号为数据总条数-表格的行数。
有些状态可以不管它
8、Edit 状态等不影响表格行数
9、Delete 之后,表格变化则会发生滚行,已经处理了。
有些确是难题,例如
10、RowMoved 行移动事件过程中会发生滚行,但由于 DBGrid 是继承 TCustomGrid 的,
而 TCustomGrid 彻底拦断了这个事件,所以无法正确计算序号,只好修改鼠标处理程
序,不让它发生滚行,没理由改 TCustomGrid 的,它会影响全世界的。
今晚先发掘到这里,有人顶再研究。
这个真是一个难题,虽然网上也有很多写明能够在 DBGrid 上显示序号的文章,结果但都是失
败的,老外的控件都没这功能,不要浪费时间找了。
1、使用 RecNo,但它是编号,不是序号,删数据之后,就不连续了,ADO 的 RecNo 例外。
2、使用 AutoInc 自动递增字段,同上删数据之后,也会不连续。
3、使用 CalcField 计算字段,做在控件里面,强加一个计算字段给用家。
4、增大用户数据集控件的缓冲器,将数据全部下载,变成内存表来计算序号,这是不
可取,为了避免影响用户的数据集控件,动态新建一个数据集控件来下载数据的方
法,就简直不知怎么形容。
5、用一个整数字段,每当增删除数据之后,历遍重新编一次号。
6、监视滚动条,但不是什么变化都触发滚动条事件。
7、改用 StringGrid 或者 ListView
1、2、6 是失败的。4、5 虽然可以取得正确序号,但消耗较大,效率较低。我认为只有 3 计算
字段这个方法消耗较少,而且正确,比较之下5的方法是很蠢的。7 在回避问题。
有些网友觉得显示序号很容易,就是用上面的其中一种,那别怪我不放在眼内,上面的 1~6 方
法有很多人不管出错没出错,效率如何就这么用了,也有商品软件用 7 方法,这些方法在论坛内
都有帖子和源代码,还炒来炒去。
要显示序号,先了解其难点,论坛的讨论认为主要是修改、插入或者添加数据的时候,RecNo
会变 -1,如果就这个简单,那就不是问题,问题是 RecNo 根本不能用。
那么冷静分析一下,除了 RecNo 外还有什么位置信息可以获得,表格本身有什么规律,规律
真是有的,例如:
1、数据总条数等于 0 的时候,表格第一行序号为 0,TopRowID:=0,既然它事实存在,就
不应该放过它,这条成立的话,Bof和Eof是什么状态,也不用管。
2、无论任何状态下,数据条数等于少于表格行数时,表格第一行序号恒为 1,其它的不管。
代码就是 if Dataset.RecordCount <= RowCount then TopRowID:=1;
3、Insert 插入数据状态下,行数增加,但表格序号不变,TopRowID 不变,不管它。
4、Append 添加数据状态下,先符合第2条,数据现在条数 +1 等于少于表格行数时,表格
第一行序号为 1,否则因为表格自动上滚一行,第一行序号要 +1。Inc(TopRowID);
5、光标垂直移动,翻页会触发滚动事件,滚动事件的 Distance 参数+第一行序号,就等于
滚动翻页后的新序号。TopRowID:=TopRowID+Distance;
数据集 First,Last 等操作提供 Bof 和 Eof 来定位。
6、Bof 等于真的时候,表格第一行序号恒为 1。
7、Eof 等于真的时候,表格第一行序号为数据总条数-表格的行数。
有些状态可以不管它
8、Edit 状态等不影响表格行数
9、Delete 之后,表格变化则会发生滚行,已经处理了。
有些确是难题,例如
10、RowMoved 行移动事件过程中会发生滚行,但由于 DBGrid 是继承 TCustomGrid 的,
而 TCustomGrid 彻底拦断了这个事件,所以无法正确计算序号,只好修改鼠标处理程
序,不让它发生滚行,没理由改 TCustomGrid 的,它会影响全世界的。
今晚先发掘到这里,有人顶再研究。