如何修复 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 中的行和列重复的主要内容,如果未能解决你的问题,请参考以下文章

如何根据pyspark中的行和列条件过滤多行

如何在iOS中的按钮数组中检索所选按钮的行和列

iPhone 应用程序编程中的行和列

重命名R中的行和列

如何在 MVC 应用程序中转置 Kendo UI 网格中的行和列?

如何转换由 | 分隔的顺序数据并且在 pyspark 中的行和列中没有换行符