⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 subject_19293.htm

📁 一些关于vc的问答
💻 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>&nbsp;&nbsp;&nbsp;&nbsp;CListCtrl* pV=(CListCtrl*)lParamSort;<BR>&nbsp;&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;CString&nbsp;&nbsp;&nbsp;&nbsp;strItem1 = pV-&gt;GetItemText(lParam1, g_nSubItem);<BR>&nbsp;&nbsp;&nbsp;&nbsp;CString&nbsp;&nbsp;&nbsp;&nbsp;strItem2 = pV-&gt;GetItemText(lParam2, g_nSubItem);<BR>&nbsp;&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int iCompRes = strcmp(strItem1, strItem2);<BR>&nbsp;&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;//根据当前的排序方式进行调整<BR>&nbsp;&nbsp;&nbsp;&nbsp;if(g_bAscend)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return iCompRes;<BR>&nbsp;&nbsp;&nbsp;&nbsp;else<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return iCompRes*-1;<BR>}<BR><BR>void CLanDlg::OnColumnclickList1(NMHDR* pNMHDR, LRESULT* pResult) <BR>{<BR>&nbsp;&nbsp;&nbsp;&nbsp;NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;<BR>&nbsp;&nbsp;&nbsp;&nbsp;// TODO: Add your control notification handler code here<BR>&nbsp;&nbsp;&nbsp;&nbsp;if( pNMListView-&gt;iSubItem == g_nSubItem)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;g_bAscend = !g_bAscend;<BR>&nbsp;&nbsp;&nbsp;&nbsp;else<BR>&nbsp;&nbsp;&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;g_bAscend = TRUE;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;g_nSubItem = pNMListView-&gt;iSubItem;<BR>&nbsp;&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp;&nbsp;m_list.SortItems( ListCompare, (DWORD)&m_list );<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;*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>&nbsp;&nbsp;&nbsp;&nbsp;CListCtrl* pV=(CListCtrl*)lParamSort;<BR>&nbsp;&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;CString&nbsp;&nbsp;&nbsp;&nbsp;strItem1 = pV-&gt;GetItemText(lParam1, g_nSubItem);<BR>&nbsp;&nbsp;&nbsp;&nbsp;CString&nbsp;&nbsp;&nbsp;&nbsp;strItem2 = pV-&gt;GetItemText(lParam2, g_nSubItem);<BR>&nbsp;&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int iCompRes = strcmp(strItem1, strItem2);<BR>&nbsp;&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;//根据当前的排序方式进行调整<BR>&nbsp;&nbsp;&nbsp;&nbsp;if(g_bAscend)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return iCompRes;<BR>&nbsp;&nbsp;&nbsp;&nbsp;else<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;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>&nbsp;&nbsp;&nbsp;&nbsp;CListCtrl* pV=(CListCtrl*)lParamSort;<BR>&nbsp;&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;CString strItem1, strItem2;<BR>&nbsp;&nbsp;&nbsp;&nbsp;LVFINDINFO info;<BR>&nbsp;&nbsp;&nbsp;&nbsp;int nIndex;<BR>&nbsp;&nbsp;&nbsp;&nbsp;info.flags = LVFI_PARAM;<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;info.lParam = lParam1;&nbsp;&nbsp;&nbsp;&nbsp;//由item data(lParam1)得到对应的item text<BR>&nbsp;&nbsp;&nbsp;&nbsp;if ( (nIndex=pV-&gt;FindItem(&info)) != -1)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;strItem1 = pV-&gt;GetItemText(nIndex, g_nSubItem);<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;info.lParam = lParam2;&nbsp;&nbsp;&nbsp;&nbsp;//由item data(lParam2)得到对应的item text<BR>&nbsp;&nbsp;&nbsp;&nbsp;if ( (nIndex=pV-&gt;FindItem(&info)) != -1)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;strItem2 = pV-&gt;GetItemText(nIndex, g_nSubItem);<BR>&nbsp;&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int iCompRes = strcmp(strItem1, strItem2);<BR>&nbsp;&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;//根据当前的排序方式进行调整<BR>&nbsp;&nbsp;&nbsp;&nbsp;if(g_bAscend)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return iCompRes;<BR>&nbsp;&nbsp;&nbsp;&nbsp;else<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;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 + -