📄 subject_19293.htm
字号:
<p>
序号:19293 发表者:符号 发表日期:2002-10-27 19:03:53
<br>主题:ListCtrl排序困惑
<br>内容:点击ListCtrl顶部按钮,对记录进行排序。<BR>第一次点击按钮时,可以正确排序<BR>再点,排序结果就不正确了<BR><BR>我已经参考过<BR>http://www.vchelp.net/article/sort_in_list_ctrl.htm <BR><BR>下面是我的ListCtrl排序源代码,请各位不吝执教!谢谢<BR><BR>int g_nSubItem;//按哪一列纪录排序?<BR>BOOL g_bAscend = TRUE;//升序、降序?<BR>int CALLBACK ListCompare(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort)<BR>{<BR> CListCtrl* pV=(CListCtrl*)lParamSort;<BR> <BR> CString strItem1 = pV->GetItemText(lParam1, g_nSubItem);<BR> CString strItem2 = pV->GetItemText(lParam2, g_nSubItem);<BR> <BR> int iCompRes = strcmp(strItem1, strItem2);<BR> <BR> //根据当前的排序方式进行调整<BR> if(g_bAscend)<BR> return iCompRes;<BR> else<BR> return iCompRes*-1;<BR>}<BR><BR>void CLanDlg::OnColumnclickList1(NMHDR* pNMHDR, LRESULT* pResult) <BR>{<BR> NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;<BR> // TODO: Add your control notification handler code here<BR> if( pNMListView->iSubItem == g_nSubItem)<BR> g_bAscend = !g_bAscend;<BR> else<BR> {<BR> g_bAscend = TRUE;<BR> g_nSubItem = pNMListView->iSubItem;<BR> }<BR> m_list.SortItems( ListCompare, (DWORD)&m_list );<BR><BR> *pResult = 0;<BR>}
<br><a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p>
<hr size=1>
<blockquote><p>
<font color=red>答案被接受</font><br>回复者:未出手的飞刀 回复日期:2002-10-28 11:17:01
<br>内容:不是很清楚你的实现,但是我可以猜测如下:<BR><BR>int CALLBACK ListCompare(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort)<BR>{<BR> CListCtrl* pV=(CListCtrl*)lParamSort;<BR> <BR> CString strItem1 = pV->GetItemText(lParam1, g_nSubItem);<BR> CString strItem2 = pV->GetItemText(lParam2, g_nSubItem);<BR> <BR> int iCompRes = strcmp(strItem1, strItem2);<BR> <BR> //根据当前的排序方式进行调整<BR> if(g_bAscend)<BR> return iCompRes;<BR> else<BR> return iCompRes*-1;<BR>}<BR><BR>在上函数中,你对lParam1和lParam2的理解是不是错了,它们不是item的值,而是item data值。<BR>那么你第一次排序之所以正确是由于刚好item=item data了,排序了1次后由于item和item data不在一样,所以结果自然错了。<BR>
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:符号 回复日期:2002-10-28 11:44:17
<br>内容:感谢DancingCalf<BR><BR>看了一下MSDN,没搞懂如何通过item data得到对应的item text,请继续指教!!<BR>
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:未出手的飞刀 回复日期:2002-10-28 11:49:07
<br>内容:应该每排序一次都要设置一下item data吧<BR><BR>看 http://www.codeguru.com/listview/index.shtml 吧
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:符号 回复日期:2002-10-28 12:11:38
<br>内容:搞定了<BR>通过item data得到对应的item text<BR>再根据item text进行排序<BR>ListCompare函数改写为<BR>int CALLBACK ListCompare(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort)<BR>{<BR> CListCtrl* pV=(CListCtrl*)lParamSort;<BR> <BR> CString strItem1, strItem2;<BR> LVFINDINFO info;<BR> int nIndex;<BR> info.flags = LVFI_PARAM;<BR><BR> info.lParam = lParam1; //由item data(lParam1)得到对应的item text<BR> if ( (nIndex=pV->FindItem(&info)) != -1)<BR> strItem1 = pV->GetItemText(nIndex, g_nSubItem);<BR><BR> info.lParam = lParam2; //由item data(lParam2)得到对应的item text<BR> if ( (nIndex=pV->FindItem(&info)) != -1)<BR> strItem2 = pV->GetItemText(nIndex, g_nSubItem);<BR> <BR> int iCompRes = strcmp(strItem1, strItem2);<BR> <BR> //根据当前的排序方式进行调整<BR> if(g_bAscend)<BR> return iCompRes;<BR> else<BR> return iCompRes*-1;<BR>}<BR>其余部分不变<BR><BR>一切ok<BR><BR>再次感谢DancingCalf帮我找到问题所在!<BR><BR>
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -