【发布时间】: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