CMFCListCtrl控制項排序)

來源:互聯網
上載者:User

項目開發工具為VS2010,對於用慣了VC6的我來說,有些新特性摸起來真有些費神。這兩天為了一個資料顯示列表弄得雲裡霧裡的。

背景是這樣的:

1、要在介面中顯示資料庫中資料(表格形式),每列要有標題名。

2、資料庫中的一個欄位可能要拆分稱兩列進行顯示。

3、顯示的資料要能任意列進行排序,每列的資料可能有重複值。

因此,我使用了“列表”控制項。後來聽說VS2010中有個CMFCListCtrl的類用起來要比CListCtrl方便。就使用了CMFCListCtrl去關聯該控制項。然後為了排序,重載了CMFCListCtrl的OnCompareItems()函數,在該函數中添加了同列兩項值的大小比較演算法,並根據比較結果返回(1/0/-1)。當我驚歎於MFC的進化時,麻煩開始了。發現排序對於有重複值的列並不是準確的,總是在排了幾次後就打亂了順序。並且由此導致,兩列(某一列中有重複值)交替排序不正確。

通過不懈努力,終於在罈子裡搜到了答案:

要點一:添加一項的時候要使用SetItemData(i,i)綁定一個序號,該序號要唯一。

  CString str;
  str.Format(_T("%d"), i);
  m_ListDB_sblx.InsertItem(i, str);
  m_ListDB_sblx.SetItemData(i, (DWORD)i);    // 一般就設定一個唯一的值.不唯一排序可能有點亂,

要點二:重載比較函數時,要通過下面的方法才能保證正確的取出要比較的欄位。

//重載的排序比較函數:用於比較兩個項的大小關係
int CMFCListCtrlEx::OnCompareItems(LPARAM lParam1, LPARAM lParam2, int iColumn) 
{
    // 取出兩個比較項內容
    CString strItem1,strItem2;
    LVFINDINFO lvfi;
    lvfi.flags=LVFI_PARAM;
    lvfi.lParam=lParam1;
    strItem1 = GetItemText(FindItem(&lvfi,-1),iColumn);
    lvfi.lParam=lParam2;
    strItem2 = GetItemText(FindItem(&lvfi,-1),iColumn); 

    //第0列按整數排序
   if (iColumn == 0 )
   {
        int nItem1 = _ttoi(strItem1);
        int nItem2 = _ttoi(strItem2);

        if (nItem1 == nItem2)  
       {  
            return 0;  
       }
       else
            return(nItem1 < nItem2 ? -1 : 1);
    }
    else
    {
          //比較字串
         int iSort = _tcsicmp(strItem1, strItem2);
         return(iSort);
    }
}

在注意了以上兩點之後,控制項置為"Report"類型,把控制項的"Sort"屬性置為"None",再設定其他屬性。即可得到正確的排序結果。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.