我英语说得不太好。使用翻译器讲话可能会很尴尬。
将 CLISTCTRL 的内容保存为 C++ 中的 .csv 文件。 我想用 CLISTCTRL 再次加载保存的内容! 问题是在执行期间加载时,索引 0 到 10 正常显示。 从第 11 个索引到第 10 个索引出现重复输出,并且字符被截断。 如果您能让我知道下面的代码有什么问题以及需要纠正什么,我将不胜感激!
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 个索引处的输出被覆盖。
问题是您的列表是按字母顺序排序的。您调用
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);
否则,一旦将所有项目插入列表中,您将无法访问数据。
另外不要忘记最终删除分配的数据。