链接第三方CSV阅读器到进度条

本文关键字:第三方 CSV 链接 | 更新日期: 2023-09-27 18:15:34

我从这个链接中找到了Sebastien Lorion编写的一个编写得很好的CSV解析器/阅读器。

我喜欢这个CSV解析器的地方是,我可以很容易地将它绑定到DataGrid,如:

using (CachedCsvReader csv = new
   CachedCsvReader(new StreamReader(txtChosenFile.Text), true))
        {
            dataGridView1.DataSource = csv;
        }

这是我需要在我的项目,因为我希望我的用户在提交到数据库之前预览它。

然而,由于加载文件需要一段时间,我需要使用进度条向用户提供至少一个反馈。不幸的是,只有一个行来获取CachedCsvReader类,这使得我很难在读取csv文件的过程中链接或更新进度条。

如果它只是一个简单的CsvReader类,它将很容易更新我的进度条,如:

using (StreamReader sr = new StreamReader(openFileDialog1.FileName))
        {
            using (CsvReader csv = new
       CsvReader(sr, true))
            {
                double progress = (double) sr.BaseStream.Position /  (double) sr.BaseStream.Length;
                progressBar1.Value = (int)progress*100;
            }
        }

但是,由于我使用的是CachedCsvReader,并且只有一个(或两个)行来上传csv阅读器,而没有关于流位置和长度的信息,那么我无法更新我的进度条。

那么,将我的进度条连接到我的CachedCsvReader的最好方法是什么?

链接第三方CSV阅读器到进度条

假设您正在启动一个名为Open的方法的读取,下面的操作应该可以工作。它使用定时器控件每隔1秒轮询读取位置:

private StreamReader sr;
public void Open()
{
    Timer timer = new Timer();
    timer.Interval = 1000;
    timer.Tick += new EventHandler(timer_Tick);
    timer.Enabled = true;
      timer.Start();
    using (this.sr = new StreamReader(openFileDialog1.FileName))
    {
        using (CachedCsvReader csv = new CachedCsvReader(sr, true))
        {
            dataGridView1.DataSource = csv;
        }
    }
      timer.Stop();
    timer.Enabled = false;
    timer.Tick -= new EventHandler(timer_Tick);
}
void timer_Tick(object sender, EventArgs e)
{
    if (null != this.sr)
    {
        double progress = (double)sr.BaseStream.Position / (double)sr.BaseStream.Length;
        progressBar1.Value = (int)progress * 100;
    }
}