如何修复 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() 对话框我假设你正在使用。
如何解决 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() 对话框我假设你正在使用。