CGridCtrl 排序问题

小哥哥1102 2011-03-01 09:41:56
如何对CGridCtrl控件进行点击表头排序,有的表头按数值排序有的表头按字符排序?
...全文
405 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
信阳毛尖 2011-03-01
  • 打赏
  • 举报
回复 1
排序操作

void SetHeaderSort(BOOL bSortOnClick = TRUE) 设置在ListMode下,点击列标题头时,是否对行进行排序.

BOOL GetHeaderSort() 判断在ListMode下,点击列标题头时,是否对行进行排序.

SetSortColumn(int nCol 设置当前已排序列的索引。

int GetSortColumn() 获取当前已排序列的索引。

void SetSortAscending(BOOL bAscending) 设置当前排序列是否按升序排序。

BOOL GetSortAscending() 判断当前排序列是否按升序排序。

BOOL SortTextItems(int nCol, BOOL bAscending, LPARAM data = 0) 根据单元格文本内容对指定列排序. 成功则返回TRUE.

BOOL SortItems(int nCol, BOOL bAscending, LPARAM data = 0) 使用比较函数在指定列进行排序.如果没有指定函数,则对行按文本进行排序.成功则返回TRUE.可参考SetCompareFunction()

void SetCompareFunction(PFNLVCOMPARE pfnCompare) 设置对进行排序的回调函数. 可从下面的到更多的细节。

BOOL SortItems(PFNLVCOMPARE pfnCompare, int nCol, BOOL bAscending, LPARAM data = 0) 使用比较函数pfnCompare在指定的列进行排序.从函数CListCtrl::SortItems中可以寻求一些关于这个函数的形式的信息成功则返回TRUE.

排序是通过使用变量SortItems, SortTextItems中的一个或者在listmode下点击列标题头来实现。

注意:在虚拟模式下不能进行排序。这是因为在虚拟模式下,Grid不能存储单元格中的任何信息,因此,也就不能存储任何对单元格进行排序的信息。

处理排序的最简单方法是先设置单元格的比较函数(调用SetCompareFunction),接着调用SortItems(int nCol, BOOL bAscending, LPARAM data = 0)。nCol是要排序的列,bAscending设置是按升序还是按降序排序,data是应用中将要传递给比较函数的的一个特殊数据。

比较函数必须是一个全局或静态函数,其格式如下:

int CALLBACK pfnCellCompare(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort)

lParam1和 lParam2是CGridCellBase的指针,而lParamSort就是应用中作为参数变量传递给函数SortItems的特殊数据。如果第一个单元格的值小于第二个单元格的值,函数返回-1,相等返回0,否则返回1。

下面就是一个排序比较函数的例子:

int CALLBACK MyClass::pfnCellNumericCompare(LPARAM lParam1,

LPARAM lParam2,

LPARAM lParamSort)

{

CGridCellBase* pCell1 = (CGridCellBase*) lParam1;

CGridCellBase* pCell2 = (CGridCellBase*) lParam2;

if (!pCell1 || !pCell2) return 0;</P><P>int nValue1 = _ttol(pCell1->GetText());

int nValue2 = _ttol(pCell2->GetText());</P><P>if (nValue1 < nValue2)

return -1;

else if (nValue1 == nValue2)

return 0;

else

return 1;

}

还提供了两个有用的函数:

int CALLBACK CGridCtrl::pfnCellTextCompare(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort)

int CALLBACK CGridCtrl::pfnCellNumericCompare(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort)

这两个函数是通过文本内容和数值进行排序的(分别使用itoa)。为Grid设置比较函数,仅仅需要调用:

m_Grid.SetCompareFunction(CGridCtrl::pfnCellNumericCompare);

如果这个比较函数设置为空,那么将默认调用函数CGridCtrl::pfnCellTextCompare

小哥哥1102 2011-03-01
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 tandyt 的回复:]
这个估计要自己编程实现吧,因为不同的排序规则,要你自己去定义并且实现排序,默认的控件是不会这么智能的。
[/Quote]
你使用过这个控件排序吗?给个思路吧
TandyT 2011-03-01
  • 打赏
  • 举报
回复
这个估计要自己编程实现吧,因为不同的排序规则,要你自己去定义并且实现排序,默认的控件是不会这么智能的。

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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