将 CSV 文件加载到 CLISTCTRL

问题描述 投票:0回答:1

我英语说得不太好。使用翻译器讲话可能会很尴尬。

问题

将 CLISTCTRL 的内容保存为 C++ 中的 .csv 文件。 我想用 CLISTCTRL 再次加载保存的内容! 问题是在执行期间加载时,索引 0 到 10 正常显示。 从第 11 个索引到第 10 个索引出现重复输出,并且字符被截断。 如果您能让我知道下面的代码有什么问题以及需要纠正什么,我将不胜感激!

Excel文件

插入元素后的列表控件

struct DATA 
{
    CString strName;
    CString strEmail;
    CString strTel;
    CString strGroup;
};

//Code to initialize CLISTCTRL
//CLISTCTRL control name = L_viewctrl

    FILE* file = NULL;
    DATA* indexData = new DATA;

    USES_CONVERSION;

    fopen_s(&file, path_str, "r");
    if (file)
    {
        char szContent[2048];

        memset(szContent, NULL, sizeof(szContent));

        CString strRstring;
        int nFileline(0);
        int nSubString(0);
        while (fgets(szContent, 2048, file))
        {
            //File Read
            CString strFile;
            strFile = szContent;

            bool bfileLineRet = TRUE;
            while (bfileLineRet)
            {
                AfxExtractSubString(strRstring, strFile, nSubString++, ',');
                if (nSubString == 2)indexData->strName = strRstring;

                if (nSubString == 3)indexData->strEmail = strRstring;

                if (nSubString == 4)indexData->strTel = strRstring;

                if (nSubString == 5) 
                {
                    indexData->strGroup = strRstring;
                    nSubString = 0;
                    bfileLineRet = FALSE;
                }
            }

            //LIST INDEX DATA SET;
            UpdateData(TRUE);
            CString strCount;
            strCount.Format(_T("%d"), nFileline);
            L_viewctrl.InsertItem(nFileline, strCount);
            L_viewctrl.SetItem(nFileline, 1, LVIF_TEXT, indexData->strName, 0, 0, 0, 0);
            L_viewctrl.SetItem(nFileline, 2, LVIF_TEXT, indexData->strEmail, 0, 0, 0, 0);
            L_viewctrl.SetItem(nFileline, 3, LVIF_TEXT, indexData->strTel, 0, 0, 0, 0);
            L_viewctrl.SetItem(nFileline, 4, LVIF_TEXT, indexData->strGroup, 0, 0, 0, 0);
            nFileline++;
        }
    }
    fclose(file);

我尝试将 csv 文件加载到 LISTCTRL 中并打印值。 我想正常读取csv文件并将其输出到LISTCTRL,但是 读取并打印csv文件成功。然而,它一直正常输出到第 10 个索引,但之后,第 10 个索引处的输出被覆盖。

visual-c++ mfc clistctrl
1个回答
0
投票

问题是您的列表是按字母顺序排序的。您调用

InsertItem(nFileline,...
,然后假设刚刚插入的项目的位置是
nFileline
,但这不是因为项目是根据字母排序插入的。例如,因此项目“10”被插入到项目“1”之后(您可以在您发布的图像上清楚地看到这一点)。

您可以使用

InsertItem
返回的值来纠正该问题,该值是列表中实际插入项目的索引。

类似:

int index = L_viewctrl.InsertItem(nFileline, strCount);
L_viewctrl.SetItem(index, 1, LVIF_TEXT, indexData->strName, 0, 0, 0, 0);
L_viewctrl.SetItem(index, 2, LVIF_TEXT, indexData->strEmail, 0, 0, 0, 0);
...

此外,您可以将列表控件的“排序”属性设置为“无”。您可能根本不想排序,因为您可能希望列表控件中的顺序与 CSV 文件中的顺序相同。


顺便说一句:您会偶然发现另一个问题:您插入的项目将永远丢失。您需要使用

CListCtrl::SetItemData
来存储指向列表中每个项目中的数据的指针,类似。

...
int index = L_viewctrl.InsertItem(nFileline, strCount);
L_viewctrl.SetItemData(index, (DWORD_PTR)indexData);

否则,一旦将所有项目插入列表中,您将无法访问数据。

另外不要忘记最终删除分配的数据。

© www.soinside.com 2019 - 2024. All rights reserved.