CListCtrl,按照某列进行排序(本地数据倒序、正序)---SetItemData和GetItemData

1、h文件中

1
2
3
4
5
afx_msg void OnColumnClick(NMHDR *pNMHDR, LRESULT *pResult);
 
int static CALLBACK CompareByTime(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort);
 
CListCtrl m_list_;

  

记得是CListCtrl类。如果用子类,记得看一下是否有OnColumnClick

 

2、cpp文件中:

1
2
3
4
BEGIN_MESSAGE_MAP(CDlgOssJson, CBCGPDialog)
    ON_NOTIFY(LVN_ITEMCHANGED, IDC_LIST_ITEMS, &CDlgOssJson::OnLvnItemchangedList)
    ON_NOTIFY(LVN_COLUMNCLICK, IDC_LIST_ITEMS, &CDlgOssJson::OnColumnClick)
END_MESSAGE_MAP()

  

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
BOOL CDlgOssJson::OnInitDialog()
{
    CBCGPDialog::OnInitDialog();
 
    DWORD dwStyle = m_list_.GetExtendedStyle();
    dwStyle |= LVS_EX_FULLROWSELECT;
    dwStyle |= LVS_EX_GRIDLINES;
    dwStyle |= LVS_EX_CHECKBOXES;
    m_list_.SetExtendedStyle(dwStyle); 
    int nCol = 0;    //列标题
    m_list_.InsertColumn(nCol++, _T("名称"), LVCFMT_CENTER, 300);
    m_list_.InsertColumn(nCol++, _T("上传时间"), LVCFMT_CENTER, 200);
 
    GetItemsData(1);
    return TRUE;
}
 
void CDlgOssJson::OnLvnItemchangedList(NMHDR *pNMHDR, LRESULT *pResult)
{
    LPNMLISTVIEW pNMLV = reinterpret_cast<LPNMLISTVIEW>(pNMHDR);
    if (pNMLV->iSubItem == 0)
    {
        BOOL bChk = TRUE;
        int nCount = m_list_.GetItemCount();
        for(int i = 0; i < nCount; ++i)
        {
            bChk = m_list_.GetCheck(i);
            if (!bChk)
            {
                break;
            }
        }
        m_chk_all_.SetCheck(bChk);
    }
    *pResult = 0;
}
 
int CALLBACK CDlgOssJson::CompareByTime(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort)
{
    oss_json_data *cd1 = (oss_json_data*)(LPARAM)lParam1;    //SetItemData时的值
    oss_json_data *cd2 = (oss_json_data*)(LPARAM)lParam2;
    if (cd1 != NULL && cd2 != NULL)
    {
        return st_bMethod ? cd1->strTime.CompareNoCase(cd2->strTime) : cd2->strTime.CompareNoCase(cd1->strTime);
    }
    else
    {
        return int(st_bMethod);
    }
}
 
void CDlgOssJson::OnColumnClick(NMHDR *pNMHDR, LRESULT *pResult)
{
    LPNMLISTVIEW pNMLV = reinterpret_cast<LPNMLISTVIEW>(pNMHDR);
    *pResult = 0;
 
    if (st_nSortColumn == pNMLV->iSubItem)
    {
        st_bMethod = !st_bMethod;
        m_list_.SortItems(CompareByTime, (DWORD_PTR)&m_list_);    //(DWORD_PTR)this也可以将this对话框传入CompareByTime
    }
}

  
重点来了
要记得

1
2
3
4
5
6
7
8
9
10
11
m_list_.DeleteAllItems();
int iSize = m_vec_items_.size();
for (int i = 0; i < iSize; ++i)
{
    CString strItem = _T("");
    strItem.Format(_T("%d"), i + 1);
    m_list_.InsertItem(i, strItem);    //行标题
    m_list_.SetItemData(i, (LPARAM)(oss_json_data*)&m_vec_items_[i]);    //列排序时用
    m_list_.SetItemText(i, 0, m_vec_items_[i].strProjName);
    m_list_.SetItemText(i, 1, m_vec_items_[i].strTime);
}

  

posted @   曦花  阅读(144)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
历史上的今天:
2014-04-18 vs2008配置winddk
2014-04-18 在初次安vs2008时设置的为C#现在怎么将其改为其他类型的界面
点击右上角即可分享
微信分享提示