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

时间:2015-05-25 07:52:16

标签: visual-c++ mfc clistctrl

enter image description here

如何修复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")); 

2 个答案:

答案 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()中说。