社区
C++ Builder
帖子详情
BCB 的ListView控件如何实现点击一个列头就自动对所有的记录进行升序/降序排序?
djfu
2006-11-21 02:02:50
就像VC的ListCtrl一样,点击一下列头,可以对所有的记录安装这个列进行升序或降序进行排序,这样如何实现?
例如:一个学生表(序号、姓名、性别、班级)
点击序号列按照序号进行排序;点击班级列安装班级进行排序。
...全文
415
4
打赏
收藏
BCB 的ListView控件如何实现点击一个列头就自动对所有的记录进行升序/降序排序?
就像VC的ListCtrl一样,点击一下列头,可以对所有的记录安装这个列进行升序或降序进行排序,这样如何实现? 例如:一个学生表(序号、姓名、性别、班级) 点击序号列按照序号进行排序;点击班级列安装班级进行排序。
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
4 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
信念
2007-03-23
打赏
举报
回复
MARK
小笨象
2006-11-21
打赏
举报
回复
int sort=0;
bool column[20];
// 全局变量定义
//------------------------------------------------------------------
void __fastcall TForm1::ListView1Compare(TObject *Sender, TListItem *Item1, TListItem *Item2, int Data, int &Compare)
{
if (column[sort]==true)
{
if (sort==0)
Compare=CompareText(Item1->Caption,Item2->Caption);
else
Compare=CompareText(Item1->SubItems->Strings[sort-1],Item2->SubItems->Strings[sort-1]);
}
else
{
if (sort==0)
Compare=CompareText(Item2->Caption,Item1->Caption);
else
Compare=CompareText(Item2->SubItems->Strings[sort-1],Item1->SubItems->Strings[sort-1]);
}
}
//------------------------------------------------------------------
void __fastcall TForm1::ListView1ColumnClick(TObject *Sender,
TListColumn *Column)
{
sort=Column->Index;
((TCustomListView *)Sender)->AlphaSort();
if (column[sort]==false) column[sort]=true;
else column[sort]=false;
}
//------------------------------------------------------------------
ListView_SortItems 具体使用在MSDN中自已看,这只是一个宏定义
其实它就是一个SendMessage(hwnd, LVM_SORTITEMS, lParamSort, pfnCompare)
三句代码搞你。这是最简单最快的。
小笨象
2006-11-21
打赏
举报
回复
列表框控件在C++Builder应用程序中的使用率很高,例如我们经常使用的资源管理器,它有四种常见的式样:显示大图标,小目标,含有图标的多列列表,含有列标头的列表。我们也经常见到一些扩展功能,例如我们在资源管理器中的文件列表框中,在选用详细资料察看时,用鼠标单击列标头,如大小,则所列文件按大小排序;单机日期,则按文件日期进行排序.这一功能增强了应用程序的可用性,使操作更直观、方便。
在C++Builder中只能根据项目的首列加以排序,不能根据子项目(SubItems)排序。如果需要根据子项目(SubItems)排序,则必须要自己写代码来实现。
以下描述如何在C++Builder5.0上为列表框添加列标头点击排序功能。
首先新建一个窗体,其名称为Form1,在窗体添加一个列表框控件,其名称为ListView1。
修改ListView1属性值,
将ViewStyle设置为vsReport。
将SortType 设置为None。
双击ListView1,添加列和子列。在例子中,我们添加4个列标头,Caption属性分别是:TEST1,TEST2,TEST3,TEST4。
单击ListView1的Items属性,通过NEW ITEM, NEW SUBITEM 来添加子列和主列上的内容。我们可以随意
填入一些内容。以便排序。
分别在ListView1ColumnClick,ListView1Compare 事件中添加以下代码:
void __fastcall TForm1::ListView1ColumnClick(TObject *Sender,TListColumn *Column)
{
Screen->Cursor=crHourGlass;
ColumnToSort = Column->Index;
ListView1->CustomSort(NULL,ColumnToSort);
Screen->Cursor=crDefault;
}
void __fastcall TForm1::ListView1Compare(TObject *Sender, TListItem *Item1,
TListItem *Item2, int Data, int &Compare)
{
AnsiString a,a1,a2,a3,b,b1,b2,b3;
if (ColumnToSort==0)
Compare = CompareText(Item1->Caption,Item2->Caption);
else
{
/*
点击其它子列时,需要将所点击的列内容从Item1->SubItems[i].Text中抽出,并参照其进行排序。子列的内容在存储中,形式为 :子项目1\r\n子项目2\r\n子项目3\r\n...子项目N\r\n。
我们抽取其中各个子项目,存放到变量 a1,a2,a3,b1,b2,b3 中,编写如下代码:
*/
a=Item1->SubItems[0].Text;
b=Item2->SubItems[0].Text;
a1=a;
b1=b;
a1.Delete(a1.AnsiPos("\r\n"),a1.Length() - a1.AnsiPos("\r\n"));
b1.Delete(b1.AnsiPos("\r\n"),b1.Length() - b1.AnsiPos("\r\n"));
a1.Delete(a1.Length(),1);
b1.Delete(b1.Length(),1);
a2=a;
b2=b;
a2.Delete(1,a2.AnsiPos("\r\n"));
b2.Delete(1,b2.AnsiPos("\r\n"));
a2.Delete(a2.AnsiPos("\r\n"),a2.Length() - a2.AnsiPos("\r\n"));
b2.Delete(b2.AnsiPos("\r\n"),b2.Length() - b2.AnsiPos("\r\n"));
a2.Delete(a2.Length(),1);
b2.Delete(b2.Length(),1);
a3=a;
b3=b;
a3.Delete(1,a3.AnsiPos("\r\n"));
b3.Delete(1,b3.AnsiPos("\r\n"));
a3.Delete(1,a3.AnsiPos("\r\n"));
b3.Delete(1,b3.AnsiPos("\r\n"));
a3.Delete(a3.Length(),1);
b3.Delete(b3.Length(),1);
switch (ColumnToSort){
case 1: { Compare =CompareText(a1,b1); break;}
case 2: { Compare =CompareText(a2,b2); break;}
case 3: { Compare =CompareText(a3,b3); break;}
default : { Compare =CompareText(a1,b1); break;}
}
}
}
编译,即可实现列标头点击排序功能的效果。
有兴趣的读者还可以把代码稍微修改,就可以实现单击以降序排列,双击以升序排列。
winner8080
2006-11-21
打赏
举报
回复
用DBGrid排序比较简单的.
BCB
中T
ListView
的列表
排序
问题
T
listView
列表
排序
问题 主要
实现
功能是只要用户使用鼠标
点击
T
ListView
记录
列表框的某一列的标题头就可以以该项内容为基础按照字母排列顺序对所有
记录
进行
排序
,如果用户连续两次
点击
同一列则可以在
升序
排列和
降序
排列之间切换。 列表
排序
这个功能基本上由T
ListView
自己提供的函数便可以
实现
,OnColumnClick函数、AlphaSort函数和OnCompare函数,其中On
ListView
控件
详解
ListView
控件
可以用来显示各项带图标的列表,也可以用来显示带有子项的列表,Windows操作系统的资源管理器中文件夹窗口就是最好的应用例子。如下图一所示就是“我的电脑”中使用
ListView
控件
来显示本机所有盘符: 说明:可以通过“查看”菜单来观察其它三种显示方式,这些都是
ListView
的视图模式之一。 下面我们就先来了解下
ListView
控件
的基本应用,在vb.net中的
[转载]
实现
ListView
的列标头
点击
排序
功能
天津大学电子与信息工程学院 宋天宁---- 列表框
控件
在应用程序中的使用率很高,在Windows中经常见到,它有四种常见的式样,分别具有显示大图标,小目标,含有图标的多列列表,含有列标头的列表。我们也经常见到一些扩展功能,例如我们在资源管理器中的文件列表框中,在选用详细资料察看时,用鼠标单击列标头,如大小,则所列文件按大小
排序
;单机日期,则按文件日期
进行
排序
.这一功能增强了应用程序的可用性,使操作
T
ListView
点击
表头
进行
排序
和显示图标的方法
这种方法是响应了OnColumnClick和OnCompare这两个事件,其中在OnColumnClick中调用T
ListView
中的CustomSort函数,并把此函数的第
一个
参数设为nil把OnCompare事件激活的。在OnCompare事件中,按照Delphi的例子,调用了CompareText函数
进行
排序
,把CompareText的返回值赋给OnCompare事件函数的Compare参数
MFC_
ListView
1. 获取当前选择行 2. 添加图片列 3.
排序
4. 设置行高(待更好方法) 5. 固定列宽 (重载OnNotify函数) 1. 获取CListCtrl
控件
当前选择行的某一列数据 CListCtrl& rList = GetListCtrl(); POSITION pos = rList.GetFirstSelectedItemPosition(); //while(pos
C++ Builder
13,825
社区成员
102,679
社区内容
发帖
与我相关
我的任务
C++ Builder
C++ Builder相关内容讨论区
复制链接
扫一扫
分享
社区描述
C++ Builder相关内容讨论区
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章