我目前正在Visual Studio 2017中制作Windows窗体。 我让DataGridView正确显示CSV中的数据。 问题是,当用户输入一些数据并保存它,然后查看DataGridView时,直到程序再次关闭并再次打开,数据才包含新数据。
因此,当用户按下按钮Save as Preset
时,将更新csv,但不会更新DataGridView中的数据。
我已经在网上搜索,找不到任何解决方案,并尝试了通常的PresetView.Refresh();
和PresetView.Update();
,但似乎也不能解决很多人的问题。
按钮代码:
public void ButtonProperties()
{
SaveCustomPreset.Click += new EventHandler(SaveCustomPreset_Click);
}
写入CSV代码:
private void DisplayPresetData(string filePath)
{
DataTable dt = new DataTable();
string[] csv_data = System.IO.File.ReadAllLines(filePath);
string[] data_col = null;
int x = 0;
foreach (string text_line in csv_data)
{
data_col = text_line.Split(',');
if(x == 0)
{
for(int i = 0; i <= data_col.Count() -1; i++)
{
dt.Columns.Add(data_col[i]);
}
x++;
}
else
{
dt.Rows.Add(data_col);
}
}
PresetView.DataSource = dt;
}
按钮点击代码:
private void SaveCustomPreset_Click(object sender, EventArgs e)
{
TextWriter txt = new StreamWriter("../../PresetData.csv", true);
txt.WriteLine(CustomPresetName.Text + "," + CustomX.Text + "," + CustomY.Text + "," + CustomZ.Text + "," + Foam.Text);
txt.Close();
PresetView.Refresh();
PresetView.Update();
}
答案 0 :(得分:1)
在代码示例中,您正在创建一个DataTable
类型的新实例,然后将其作为数据源分配给您的控件。
因此,控件的数据源是在该作用域中创建的对象实例。
private void DisplayPresetData(string filePath)
{
DataTable dt = new DataTable();
string[] csv_data = System.IO.File.ReadAllLines(filePath);
string[] data_col = null;
int x = 0;
foreach (string text_line in csv_data)
{
data_col = text_line.Split(',');
if(x == 0)
{
for(int i = 0; i <= data_col.Count() -1; i++)
{
dt.Columns.Add(data_col[i]);
}
x++;
}
else
{
dt.Rows.Add(data_col);
}
}
PresetView.DataSource = dt;
}
刷新控件不会自动调用此方法。
您可以做一些事情来解决这个问题:
您可以将DataSource(实际上是DataTable
类型)转换为DataTable
,并在SaveCustomPreset
EventHandler方法范围内向其添加数据。
private void SaveCustomPreset_Click(object sender, EventArgs e)
{
var columns = new []
{
CustomPresetName.Text,
CustomX.Text,
CustomY.Text,
CustomZ.Text,
Foam.Text
};
var line = string.Join(",", columns);
using (TextWriter txt = new StreamWriter("../../PresetData.csv", true))
{
txt.WriteLine(line);
}
var dt = (DataTable)PresetView.DataSource;
foreach(var item in columns)
{
dt.Rows.Add(item)
}
}
或者,您可以在该事件处理程序中调用DisplayPresetData(string filePath)
方法(或从文件中读取数据并将其分配给PresetView.DataSource的类似方法)
第二种实现的好处是,您可以在编写csv之外的场景中考虑对csv的修改。
第一个实现的好处是性能。 (也就是说,您避免了该方法中的流文件读取,缓冲和循环操作,而需要执行增量添加。)