リストビューのソート – プログラミング – Home

通知
すべてクリア

[解決済] リストビューのソート


あきら
 あきら
(@あきら)
ゲスト
結合: 23年前
投稿: 49
Topic starter  

こんにちは 再度質問です。

リストビュー(カラム数9)のソート処理を行っています。
カラムクリックを実行して1回目は、昇順も降順も成功するのですが、
2回目以降は、ばらばらな順番で表示されます。

void CmyView::OnColumnclick(NMHDR* pNMHDR, LRESULT* pResult)
{
NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;

CListCtrl &Ctrl = GetListCtrl();

Ctrl.SortItems(MyCompProc, pNMListView->iSubItem);

this->mSort_Status[pNMListView->iSubItem]
= !this->mSort_Status[pNMListView->iSubItem];

*pResult = 0;
}

int CALLBACK MyCompProc( LPARAM lp1 ,LPARAM lp2, LPARAM lp3 )
{
CFrameWnd* pFW = (CFrameWnd*)AfxGetMainWnd();
CProjectAView* pView = (CProjectAView*)pFW->GetActiveView();
CListCtrl &Ctrl = pView->GetListCtrl();

CString str1 = Ctrl.GetItemText(lp1, lp3);
CString str2 = Ctrl.GetItemText(lp2, lp3);

int iReturn;
// 昇順
if(pView->mSort_Status[lp3] == UP){

if (lp3 == 2 || lp3 == 3 || lp3 == 8){
iReturn = strcmp( str1, str2 );
} else {

if (atof(str1) == atof(str2))
iReturn = 0;

if (atof(str1) < atof(str2))
iReturn = -1;

if (atof(str1) > atof(str2))
iReturn = 1;
}
// 降順
} else {

if (lp3 == 2 || lp3 == 3 || lp3 == 8){

iReturn = strcmp( str2, str1 );
} else {

if (atof(str2) == atof(str1))
iReturn = 0;

if (atof(str2) < atof(str1))
iReturn = -1;

if (atof(str2) > atof(str1))
iReturn = 1;
}
}
return iReturn;
}


引用未解決
トピックタグ
あきら
 あきら
(@あきら)
ゲスト
結合: 23年前
投稿: 49
Topic starter  

慌てて、発言したので、投げやりな内容で申し訳ありませんでした。

2回目以降もソートされるように解決できました。

カラムクリック時に、LV_ITEM構造体のlParamメンバに値を再設定するようにしたら、

できました。

お騒がせしました。


返信引用
不良PG
 不良PG
(@不良PG)
ゲスト
結合: 23年前
投稿: 188
 

アイテムのLPARAMには、何を設定していますか?

予想するとアイテム追加時のインデックスを入れてると思われます。

ソートしたあとは、インデックスが変わるのでLPARAMを設定しなおさないと正しいインデック
スでソートされなくなります。

(例)

[文字]  [インデックス] [LPARAM]

・初期状態
B     0 0
C 1 1
A 2 2

・一回目の昇順ソート
A     0 2
B 1 0
C 2 1

・二回目の昇順ソート
B     0 0
A     1 2
C 2 1


返信引用
不良PG
 不良PG
(@不良PG)
ゲスト
結合: 23年前
投稿: 188
 

しまった、遅かった(^^;

LPARAMには、インデックスよりも
比較すべきデータが取得できるポインタなどを設定しておくと
再設定をしなくてもすみます。


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました