MFC中如何实现删除列表中被选中的一行,并且要动态删除文件中的那一行数据。

如何实现删除列表中被选中的一行,并且要动态删除文件中的那一行数据。

利用子菜单生成删除选项,再在删除上面添加消息函数,消息类型为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();
}

  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值