如何使用CSV文件中的新数据刷新/更新DataGridView?

时间:2018-08-23 00:41:16

标签: c# csv windows-forms-designer

我目前正在Visual Studio 2017中制作Windows窗体。 我让DataGridView正确显示CSV中的数据。 问题是,当用户输入一些数据并保存它,然后查看DataGridView时,直到程序再次关闭并再次打开,数据才包含新数据。

因此,当用户按下按钮Save as Preset时,将更新csv,但不会更新DataGridView中的数据。

enter image description here

我已经在网上搜索,找不到任何解决方案,并尝试了通常的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();
}

1 个答案:

答案 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的修改。

第一个实现的好处是性能。 (也就是说,您避免了该方法中的流文件读取,缓冲和循​​环操作,而需要执行增量添加。)