You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

按Delete键删除DataGrid行后数据库记录未删除,求排查问题

问题原因及解决方案

看起来你遇到的问题很典型——你只在内存里删除了DataGridView显示的行,但没把这个修改同步回你的"数据库"(也就是那个data.dat XML文件)。咱们一步步理清楚:

核心问题分析

你的现有代码只完成了两个环节:

  • 程序启动时从data.dat读取XML数据到App.PhoneBook,再绑定到phoneBookBindingSource让DataGridView展示
  • 按下Delete键时删除了DataGridView里的行(本质是移除了phoneBookBindingSource中的对应项)

完全缺失了把删除后的数据源重新写入data.dat文件的步骤,所以文件里的原始数据根本没变化,下次启动程序又会读回旧记录。

修复步骤

你需要修改dataGridView1_KeyDown事件的代码,在用户确认删除后,把更新后的App.PhoneBook写入XML文件:

修改后的KeyDown事件代码示例

private void dataGridView1_KeyDown(object sender, KeyEventArgs e)
{
    if (e.KeyCode == Keys.Delete)
    {
        // 先弹出确认对话框,避免误删
        var confirmResult = MessageBox.Show("确定要删除这条记录吗?", "删除确认", MessageBoxButtons.YesNo);
        if (confirmResult == DialogResult.Yes)
        {
            // 删除绑定数据源中的当前行
            phoneBookBindingSource.RemoveCurrent();
            
            // 关键操作:将修改后的数据源写入XML文件,和读取时使用相同路径
            string filename = string.Format("{0}//data.dat", Application.StartupPath);
            App.PhoneBook.WriteXml(filename);
            
            // 可选:手动刷新DataGridView,确保显示同步(绑定模式下通常会自动更新,可根据实际情况选择)
            dataGridView1.Refresh();
        }
    }
}

额外注意事项

  • 确保App.PhoneBook是支持双向绑定的类型(比如DataSetDataTable),这样删除phoneBookBindingSource里的项时,App.PhoneBook会同步更新
  • 如果程序安装在系统目录(如C盘根目录),可能会遇到写入权限问题,建议换成用户有权限的路径,比如:
    string filename = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments), "phonebook.dat");
    
  • 建议给写入操作添加异常捕获,避免因意外情况导致程序崩溃:
    try
    {
        App.PhoneBook.WriteXml(filename);
    }
    catch (Exception ex)
    {
        MessageBox.Show($"保存失败:{ex.Message}", "错误提示");
    }
    

内容的提问来源于stack exchange,提问作者user6639553

火山引擎 最新活动