0

我从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;
            }

        }

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

那么,将进度条连接到 CachedCsvReader 的最佳方式是什么?

4

1 回答 1

1

假设您正在从名为 的方法启动读取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;
    }
}
于 2013-05-27T06:53:15.927 回答