【问题标题】:How do you delete from csv table based on deletion from datagridview?如何根据从 datagridview 中删除来从 csv 表中删除?
【发布时间】:2021-04-15 09:04:26
【问题描述】:

我有一个数据网格,当应用程序关闭并在加载时检索它时,它会将其数据存储到一个 csv 文件中。我有一个使用下面显示的代码从数据网格中删除行的按钮。当我调用 delete 方法时,该行会从数据网格中删除,但不会从 csv 文件中删除。这意味着当我重新启动应用程序时,数据会重新加载到数据网格中,但没有给出正确的索引并抛出此错误:

System.NullReferenceException: 'Object reference not set to an instance of an object.' System.Windows.Forms.DataGridViewCell.Value.get returned null.

如何修改我的删除语句,以便删除数据网格视图中的行,并从我的 csv 文件中删除特定行,以便在我重新加载应用程序时不显示它?

    private void DeleteItem()
    {
        var dataGrid = dataGridViewRegisteredVehicles;
        foreach (DataGridViewCell oneCell in dataGrid.SelectedCells)
        {
            if (oneCell.Selected)
            {
                dataGrid.Rows.RemoveAt(oneCell.RowIndex);
                GetSumOfCost();
            }
        }
    }

这是存储数据的代码:

    public void Store(MainForm form)
    {
        var data = form.dataGridViewRegisteredVehicles;

        using (var temp = new FileStream(@"C:\temp\Data.csv", FileMode.OpenOrCreate, FileAccess.ReadWrite))
        {

            TextWriter write = new StreamWriter(temp);
            for (int rows = 0; rows < data.Rows.Count; rows++)
            {
                for (int columns = 0; columns < data.Columns.Count; columns++)
                {
                    write.Write("\t" + data.Rows[rows].Cells[columns].Value.ToString() + "\t" + "|");
                }
                write.WriteLine("");
            }
            write.Close();
        }

    }

这是检索数据的代码:

 public void Load(MainForm form)
    {
        string[] lines = File.ReadAllLines(@"C:\temp\Data.csv");
        string[] data;

        for (int i = 0; i < lines.Length; i++)
        {
            data = lines[i].ToString().Split('|');

            string[] row = new string[data.Length];

            for (int j = 0; j < data.Length; j++)
            {
                row[j] = data[j].Trim();
            }
            form.dataGridViewRegisteredVehicles.Rows.Add(row);
        }
    }

【问题讨论】:

  • 不,如果您使用该方法,它不会正确更新表中的数据
  • 当您编写时,您似乎使用制表符“引用”了一个字段并用竖线分隔。当你阅读时,你不会这样做。这将导致您每次读/写循环时都有多余的空白

标签: c# winforms csv datagridview


【解决方案1】:

如果您忘记 CSV 并改用 XML 文件会更容易:

  • 制作一个新表格

  • 在表单上放置一个 datagridview

  • 把这段代码放在FormClosing事件中(在formdesigner中双击FormClosing,在点击表单背景后属性网格的闪电中)

    (dataGridView1.DataSource as DataTable).WriteXml("grid.xml");
  • 将此代码放入 FormLoad 事件中:
    var dt = new DataTable();
    if(File.Exists("grid.xml")){
      dt.ReadXml("grid.xml");
    } else {
      dt.Columns.Add("Name");
      dt.Columns.Add("Age");
    }
    dataGridView1.DataSource = dt;

因此,当您从网格中删除一行时,它将从数据表中删除。从数据表中消失意味着它没有写入文件。下次程序打开时,该行不存在

这利用了数据表的内置能力,可以从 xml 文件中写入/读取自身。如果您想将其扩展为执行 csv,则可以合并到现有代码中

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-06-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多