如何修复 CListctrl 中的行和列重复
Posted
技术标签:
【中文标题】如何修复 CListctrl 中的行和列重复【英文标题】:How to fix row and column repetition in CListctrl 【发布时间】:2015-05-25 07:52:16 【问题描述】:如何在 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"));
【问题讨论】:
【参考方案1】:CListCtrl
不关心您的项目是否应该是唯一的。所以你必须自己处理。
您需要为应该唯一的项目创建和使用std::map
甚至std::set
结构,并在每次需要插入项目或列时进行查找:
插入:
std::set<CString> listItems;
listItems.insert(columnName);
查找:
const bool is_in = listItems.find(element) != listItems.end();
您也可以使用CMap
MFC 容器来执行此操作。
【讨论】:
【参考方案2】:是不是你只是在刷新内容之前没有清除列表。它再次追加行和列,而不是替换。刷新前调用m_list.DeleteAllItems()
。
评论后更新:
正确,这样可以确认您刷新内容过于频繁或出现在错误的位置。 DeleteAllItems()
将清除内容,而不是删除已添加的列标题。
因此,要么(1)首先在每个已插入的列上调用DeleteColumn()
,要么(2)最好在更合适的位置插入列,它只会发生一次。在我认为您正在使用的对话框的OnInitDialog() 中说。
【讨论】:
通过使用功能行项目不重复但对于列问题是一样的。以上是关于如何修复 CListctrl 中的行和列重复的主要内容,如果未能解决你的问题,请参考以下文章