附加时C#CSV文件仍然打开

时间:2015-02-19 14:57:11

标签: c# csv datagridview

我正在尝试允许用户在我的程序正在构建的CSV文件中添加另一个条目。它是用这样的数据库构建的:

public void CreateCsvFile()
    {
        var filepath = @"F:\A2 Computing\C# Programming Project\ScheduleFile.csv";
        var ListGather = new PaceCalculator();

        var records =
            from record in ListGather.NameGain()
                .Zip(ListGather.PaceGain(),
                    (a, b) => new { Name = a, Pace = b })
            group record.Pace by record.Name into grs
            select String.Format("{0},{1}", grs.Key, grs.Average()); //reduces the list of integers down to a single double value by computing the average.

        File.WriteAllLines(filepath, records);
    }

然后我将其称为数据网格视图,如下所示:

 private void button2_Click(object sender, EventArgs e)
    {
        CreateExtFile CsvCreate = new CreateExtFile();
        CsvCreate.CreateCsvFile();
        return;
    }

private void LoadAthletes()
    {
        string delimiter = ",";
        string tableName = "Schedule Table";
        string fileName = @"F:\A2 Computing\C# Programming Project\ScheduleFile.csv";

        DataSet dataset = new DataSet();
        StreamReader sr = new StreamReader(fileName);

        dataset.Tables.Add(tableName);
        dataset.Tables[tableName].Columns.Add("Athlete Name");
        dataset.Tables[tableName].Columns.Add("Pace Per Mile");

        string allData = sr.ReadToEnd();
        string[] rows = allData.Split("\r".ToCharArray());

        foreach (string r in rows)
        {
            string[] items = r.Split(delimiter.ToCharArray());
            dataset.Tables[tableName].Rows.Add(items);
        }
        this.dataGridView1.DataSource = dataset.Tables[0].DefaultView;

    }

按钮打开一个窗口,其中包含用于向csv文件添加新条目的字段。这就是我这样做的方式:

private void AddToScheduleBtn_Click(object sender, EventArgs e)
    {

        string FileName = @"F:\A2 Computing\C# Programming Project\ScheduleFile.csv";

        string AthleteDetails = textBox1.Text + "," + textBox2.Text;

        File.AppendAllText(FileName, AthleteDetails);

        AddToSchedule.ActiveForm.Close();


    }

虽然这可以工作一次,当我尝试再次向我的csv文件中添加另一个条目时,它表示它在另一个进程中打开并且程序崩溃了。当数据首次出现在我的datagridview中时,底部有一个空行,不应该有。允许我重复使用该过程的最佳方法是什么,以便我可以多次追加该文件?

2 个答案:

答案 0 :(得分:3)

我认为你的行,

StreamReader sr = new StreamReader(fileName);

已打开文件。您想要执行以下操作:

string allData = sr.ReadToEnd();
sr.Close();
sr.Dispose();

答案 1 :(得分:1)

我没有构建您的代码,但是当文件阅读器未关闭时,通常会引发此错误:)

您应该在LoadAthletes方法中添加sr.close()或实现自动关闭的使用:

using (StreamReader sr = new StreamReader(fileName))
{
  allData = sr.ReadToEnd();
}

或使用以下方法:

allData = File.ReadAllText(fileName);

希望这个帮助

有关详细信息,请参阅此问题do-i-need-to-explicitly-close-the-streamreader-in-c-sharp-when-using-it-to-load