如何修复MFC中CListctrl中的行和列重复。
int nItem = 0;
m_list.InsertColumn(0, _T("Name"), LVCFMT_LEFT, 100);
m_list.InsertColumn(1, _T("Area km\262"), 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"));
答案 0 :(得分:3)
CListCtrl
并不关心您的商品是否应该是唯一的。所以你必须自己处理它。
您需要为应该唯一的项目创建和使用std::map
甚至std::set
结构,并在每次需要插入项目或列时进行查找:
插入:
std::set<CString> listItems;
listItems.insert(columnName);
<强>查找强>
const bool is_in = listItems.find(element) != listItems.end();
您也可以使用CMap
MFC容器来执行此操作。
答案 1 :(得分:2)
在刷新内容之前,您是不是只是不清除列表。并且它再次追加行和列而不是替换。在刷新之前调用m_list.DeleteAllItems()
。
评论后更新:
是的,这样可以确认您经常或在错误的地方刷新内容。 DeleteAllItems()
将清除内容,而不是删除已添加的列标题。
因此,(1)首先在每个已经插入的列上调用DeleteColumn()
,或者(2)最好在更合适的地方插入列,它只会发生一次。在我认为你正在使用的对话框的OnInitDialog()中说。