如何修复 CListctrl 中的行和列重复

How to fix row and column repetition in CListctrl

如何解决 MFC 中 CListctrl 中行和列重复的问题。

int nItem = 0;
m_list.InsertColumn(0, _T("Name"), LVCFMT_LEFT, 100);
m_list.InsertColumn(1, _T("Area km2"), LVCFMT_RIGHT, 80);
m_list.InsertColumn(2, _T("Population"), LVCFMT_RIGHT, 100);
m_list.SetExtendedStyle(LVS_EX_GRIDLINES | LVS_EX_FULLROWSELECT);
ModifyStyle(0, LVS_REPORT);

nItem = m_list.InsertItem(0, _T("Libya"), 8);
m_list.SetItemText(nItem, 1, _T("1,759,540"));
m_list.SetItemText(nItem, 2, _T("5,499,074"));

nItem = m_list.InsertItem(0, _T("Senegal"), 7);
m_list.SetItemText(nItem, 1, _T("196,190"));
m_list.SetItemText(nItem, 2,_T( "10,580,307"));

nItem = m_list.InsertItem(0, _T("Cuba"), 6);
m_list.SetItemText(nItem, 1, _T("110,860"));
m_list.SetItemText(nItem, 2, _T("11,263,429")); 

CListCtrl 不关心您的项目是否应该是唯一的。所以你必须自己处理。

您需要为应该唯一的项目创建和使用 std::map 甚至 std::set 结构,并在每次需要插入项目或列时进行查找:

插入:

std::set<CString> listItems;
listItems.insert(columnName);

查找:

const bool is_in = listItems.find(element) != listItems.end();

您也可以使用 CMap MFC 容器来做到这一点。

你是不是根本没有清空列表再刷新内容。它再次附加行和列而不是替换。刷新前调用m_list.DeleteAllItems()


评论后更新:

好的,这表明您刷新内容的频率太高或刷新位置不对。 DeleteAllItems() 将清除内容,而不是删除已添加的列 headers。

所以 (1) 调用 DeleteColumn() on each of the already inserted columns first, or (2) preferably do the inserting of columns in a more appropriate place where it'll only happen once. Say in the OnInitDialog() 对话框我假设你正在使用。