我在使用CListCtrl控件时只使用LVS_ICON和LVS_SMALLICON两种模式,现在有个需求就是想动态的在数据中插入新记录,比如InsertItem(0,xxx)插一条记录到最前面。调用是成功的,但新插入的记录只在显示在最后,此时如果切换成LVS_REPORT模式时,新插入的记录显示在最前。后面这种情况算是正确的,那不使用这种模式时如何解决乱序的问题呢?
实例:
CListCtrl m_lvw;
m_lvw.ModifyStyle(LVS_ALIGNMASK, LVS_AUTOARRANGE);
m_lvw.InsertColumn(0, "Header", LVCFMT_CENTER, 100);
void CTestLvwDlg::OnBnClickedInsert()
{
static int index = 1;
CString strIndex;
strIndex.Format("%d", index++);
m_lvw.InsertItem(0, strIndex);
}
void CTestLvwDlg::OnBnClickedSmallIcon()
{
m_lvw.ModifyStyle(LVS_TYPEMASK, LVS_SMALLICON, 0);
}
void CTestLvwDlg::OnBnClickedLargeIcon()
{
m_lvw.ModifyStyle(LVS_TYPEMASK, LVS_ICON, 0);
}
void CTestLvwDlg::OnBnClickedReport()
{
m_lvw.ModifyStyle(LVS_TYPEMASK, LVS_REPORT, 0);
}
不断的调用OnBnClickedInsert()插入新记录时,LVS_REPORT显示正确而另外两种模式显示的是乱的。
经过多方查找和实验,总算把问题解决了:
每次增加一条记录时将ItemData设置成index的值,然后调用一下SortItems排序。
// Sort items by associated lParam
static int CALLBACK MyCompareProc(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort)
{
return (int)(lParam2 – lParam1);
}
void CTestLvwDlg::OnBnClickedInsert()
{
static int index = 1;
CString strIndex;
strIndex.Format("%d", index);
m_lvw.InsertItem(0, strIndex);
m_lvw.SetItemData(0, index);
m_lvw.SortItems(MyCompareProc, 0);
index++;
}
void CTestLvwDlg::OnBnClickedSmallIcon()
{
m_lvw.ModifyStyle(LVS_TYPEMASK, LVS_SMALLICON, 0);
m_lvw.SortItems(MyCompareProc, 0);
}
void CTestLvwDlg::OnBnClickedLargeIcon()
{
m_lvw.ModifyStyle(LVS_TYPEMASK, LVS_ICON, 0);
m_lvw.SortItems(MyCompareProc, 0);
}
void CTestLvwDlg::OnBnClickedReport()
{
m_lvw.ModifyStyle(LVS_TYPEMASK, LVS_REPORT, 0);
m_lvw.SortItems(MyCompareProc, 0);
}
void CTestLvwDlg::OnBnClickedSort()
{
m_lvw.SortItems(MyCompareProc, 0);
}
发贴的链接:http://topic.csdn.net/u/20080227/17/636bade4-76b6-4d7a-a0af-9308a143fbb4.html
得到提示的链接:http://www.codeguru.com/forum/archive/index.php/t-139506.html