【问】如何为ListView控件最左面增加一个不会改变顺序的数字序列?

VBAHZ 2006-01-05 11:16:52
一般的数字序列我们可以直接用插入一SubItem的办法,
但ListItem的顺序是会变的(根据用户选择排序)
那样的话,原来的数字序列也会打乱。

一种办法就是重新改写这一列的内容。

但这样既没效率又没必要,很多人的习惯只是随随便便就点了排序,
这个看看不好再点一下,这样每次都要改写ID序列的话,忙都忙死了。。。

能不能有一种,仅在添加与删除条目才更新ID序列的办法?

一个思路:使用两个ListView,一个只用来显示ID,一个才放数据
但问题也来了,如何让两个控件的当前ID位置同步起来呢?
ListView好像没有Scroll事件?
这样就无法知道哪个控件的当前ID位置变动了,也就无法同步。

看来,这个办法不好,不知道还有什么其它的办法?

(BTW:现在知道了为什么WMP的媒体库里没有ID序列了,
可能连MS也做不出来,呵呵:)
...全文
338 19 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
zyl910 2006-01-25
  • 打赏
  • 举报
回复
//又能保持某一列的数据不变动

原来的理解错了

对于这种情况一般利用Custom Draw技术
自己按照索引绘制编号
zyl910 2006-01-25
  • 打赏
  • 举报
回复
数据序列可以放在LV_ITEM.lParam中
排序时根据LV_ITEM.lParam排序

至于各列文本排序
发送TVM_GETITEM消息取得每列文本再比较
VB的ListView控件就是这样做的
VBAHZ 2006-01-25
  • 打赏
  • 举报
回复
即使直接使用comctl32.dll的ListView
能不能做到本主题呢?
如果用单控件的话,那个数字序列应该算是ListItem的一个数据列,
要做到既能排序各列数据,又能保持某一列的数据不变动,这。。。。
Tiger_Zhao 2006-01-23
  • 打赏
  • 举报
回复
换个表格控件吧
zyl910 2006-01-23
  • 打赏
  • 举报
回复
最关键原因在于VB的ListView控件封装的太差

直接使用comctl32.dll的ListView控制吧
VBAHZ 2006-01-17
  • 打赏
  • 举报
回复
照楼上兄弟所说,就是不允许任何一列排序!
因为任何一列排序都可能导致序列的变动,即使是序列这一列!
为了不变动序列而放弃排序功能,那是不可接受的。

即使对于没有自动排序的列表,也还有个手动拖动排序的功能,还是会导致序列的变动!
muchyong 2006-01-17
  • 打赏
  • 举报
回复
你让它第N列不能排序就好了,用欺骗的方法
Tiger_Zhao 2006-01-12
  • 打赏
  • 举报
回复
·右对齐:
用第二列做行头,右对齐,在 Form_Load 中设置
ListView1.ColumnHeaders(2).Position = 1
·排序:
行号用如下方式赋值
= Format$(i, String(Len(CStr(ListView1.ListItems.Count)), "@"))
·速度
几万行的列头赋值很快的,而且编程也很方便,只要用 API 函数 LockWindowUpdate 和 UpdateWindow 防止多次刷新就可以了
VBAHZ 2006-01-12
  • 打赏
  • 举报
回复
老大,如果用户把序列这一列标头拖到了后面那不麻烦了吗?

还有,既然是行标头,就应该是永远显示的,(就像Excel一样)

上述办法,还是无法解决,当拖动ListView横向滚动条时,
行标也将被滚动到看不见的位置。

VBAHZ 2006-01-12
  • 打赏
  • 举报
回复
不是列头,应该是行标头。

行标头和列表头一样,除非有项目增减,否则一般是不需要刷新的。

重写行号并不是最方便的,最方便的应该是用一个单独的ListView来显示。

一般的习惯,对于数字类的,应该是右对齐,但如果行号作为第0列的话只能左对齐,不方便。

另外,控件是允许用户拖动列标头来调整列顺序的。所以,如何让序列在最左面。。。?

想要速度的话,就不应该随便刷新不应变动的序列(除非增减记录),
对于有上万条记录的列表来说,随意排序是很随便的事,也必须是很方便的事!

每次都要重写的话。。。那。。。
Tiger_Zhao 2006-01-11
  • 打赏
  • 举报
回复
你是不是想让第一列作为类似 Excel 列头用?
重写列号是最方便的;想要速度就应该用子类化技术在 LVM_REDRAWITEMS 中绘制。
junki 2006-01-06
  • 打赏
  • 举报
回复
当选择数字列为无效状态
vansoft 2006-01-06
  • 打赏
  • 举报
回复
我都是重写序号。

但都是从改变的那列往下开始重写序号。
Tiger_Zhao 2006-01-06
  • 打赏
  • 举报
回复
根据用户选择排序中不包括数字列
VBAHZ 2006-01-06
  • 打赏
  • 举报
回复
难道没人用过资源管理器吗?

To Tiger_Zhao(VB老鸟) :
我们点击的是文件名列排序,你能让最前面的序列不改变吗?

To vansoft(Vansoft Workroom) :
我们点击的是整列排序,所以总是要改写全部序列的。

To junki(『.NET技术争霸天下』) :
如果当你点击资源管理器的文件大小的列标头,以为会排序时,
却发现是无效状态,作何感想?

所以,在允许排序的列表中,任何限制用户排序的行为都是不可取的。
即使,序列本身也是允许用户点击排序的(只是它永远正序的)



VBAHZ 2006-01-05
  • 打赏
  • 举报
回复
To rainstormmaster(暴风雨 v2.0):

同步滚动只是第一个难题。

接下来还有同步选定的难题,
要知道ListView的拉框选择是很方便(对用户)也是很麻烦(对程序员)的

另外还有一个序列宽度的问题,
如果太宽,必将影响显示,还要同步调节右边上的ListView的左边界。

还有一个同步背景图的难题,
要两个控件的背景看起来像一张图

还有。。。还有。。。暂时还没想到,呵呵:)
VBAHZ 2006-01-05
  • 打赏
  • 举报
回复
不可能!

打个比方吧:

如果资源管理器里,只有删除或增加文件后才能排序,你有何感想?
(要我说:破Windows,原来这么笨,扔了它,呵呵:)


rainstormmaster 2006-01-05
  • 打赏
  • 举报
回复
//但问题也来了,如何让两个控件的当前ID位置同步起来呢?
ListView好像没有Scroll事件?

用子类,看http://community.csdn.net/Expert/topic/4494/4494995.xml?temp=.456875里我的回复,当然你处理的消息要改成 WM_VSCROLL
okay2003 2006-01-05
  • 打赏
  • 举报
回复
//能不能有一种,仅在添加与删除条目才更新ID序列的办法?

那能不能平时不允许排序,只在添加与删除这两个事件发生的时候后才允许listview控件重新排序呢?有时候更简单的办法反而更有效。
ListView1.Sorted = True
ListView1.Sorted = False

1,488

社区成员

发帖
与我相关
我的任务
社区描述
VB API
社区管理员
  • API
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧