关于ListView排序的问题

smile_yuzhe 2002-08-22 10:40:01
我想实现单击表头,就自动按照表头排序的功能,就像98文件列表一样的功能,怎么做那?
...全文
51 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
smile_yuzhe 2002-08-23
  • 打赏
  • 举报
回复
书上说用CustomSort可以实现自定义的排序,对于这点我还是不太明白。
maxying 2002-08-22
  • 打赏
  • 举报
回复
哈哈,还有简单的方法,很短的~~~
void __fastcall TMainForm::ListViewColumnClick(TObject *Sender,
TListColumn *Column)
{
ColumnToSort = Column->Index;
((TCustomListView *)Sender)->AlphaSort();
}
//---------------------------------------------------------------------------

void __fastcall TMainForm::ListViewCompare(TObject *Sender, TListItem *Item1,
TListItem *Item2, int Data, int &Compare)
{
if (ColumnToSort == 0)
Compare = CompareText(Item1->Caption,Item2->Caption);
else
{
int ix = ColumnToSort - 1;
Compare =
CompareText(Item1->SubItems->Strings[ix], Item2->SubItems->Strings[ix]);
}
}
shclhs 2002-08-22
  • 打赏
  • 举报
回复
你去搜,有很多
我搜到后收藏的如下




主  题: 斑竹,我帮你整了个东东,要不要?在C++Builder5.0中实现ListView的列标头点击排序功能
作  者: cmsoft (韦小宝是我的老乡)
等  级:
信 誉 值: 100
所属论坛: C++ Builder
问题点数: 5
回复次数: 9
发表时间: 2002-5-13 13:56:37



列表框控件在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;}
}
}
}
编译,即可实现列标头点击排序功能的效果。
有兴趣的读者还可以把代码稍微修改,就可以实现单击以降序排列,双击以升序排列。

13,825

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder相关内容讨论区
社区管理员
  • 基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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