如何实现删除列表中被选中的一行,并且要动态删除文件中的那一行数据。
利用子菜单生成删除选项,再在删除上面添加消息函数,消息类型为COMMAND,然后函数里面具体实现如下
void CMyBrowseDlg::On32775Delete()
{
// TODO: 在此添加命令处理程序代码
int nItem = m_allstudent.GetSelectionMark();//函数返回被焦点选中的第几行,从第0行开始
m_allstudent.DeleteItem(nItem);//删除第nItem行
}
问题
但是结合文件来看,列表删除的只是显示的效果,真正的数据并没有被删除。
如何解决动态更新文件中的数据呢?
首先想想MFC中的CFile类有没有直接删除文件中指定位置的数据方法???
答:暂时没有找到相关资料
所以我使用以下方法实现动态删除文件中的数据:
一、首先我们已经知道被选中的是哪一行,也就知道了文件中的哪一行需要被删除
二、先把文件中的所有数据一行一行读出来,每一行存入一个CStringArray字符数组中,每一个数组对象存放的是一个学生信息
三、重新把文件数据写入(使用modeCreate,先清空文件,再写),重点:不写被删除的那一行,这一行由列表控件的函数获取第几行。
void CMyBrowseDlg::On32775Delete()
{
// TODO: 在此添加命令处理程序代码
int nItem = m_allstudent.GetSelectionMark();
m_allstudent.DeleteItem(nItem);//nItem代表被选中的行,从0开始
CStringArray stusave;
CString temp;
int n = 0;
//把文件数据读出,在输入,重点在于不输入第nItem个数据
CStdioFile fin;
CString FileName = _T("A:\\student.txt");
fin.Open(FileName, CFile::modeRead);
//逐行读取字符串
while (fin.ReadString(temp))//逐行读取的内容存入参数中
{//这里的Reading函数有程序bug,必须要到文件中敲一下空格,再删除,读出来的数据才是整行,不然就是只有第一个空格前面的数据
stusave.Add(temp);
temp = ' ';
n++;
}
fin.Close();
CStdioFile fout;//选用modeCreate先清空文件数据,再写的同时不写被删除的那一行数据就实现了动态删除功能
fout.Open(FileName, CFile::modeCreate | CFile::modeWrite);
for (int i = 0; i < n; i++)
{
if (i == nItem) continue;
fout.WriteString(stusave.GetAt(i)+"\n");//GetAt(i)获取指定位置i处的数据,相当于数组下标[]
}
fout.Close();
}