链接第三方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阅读器,而没有关于流位置和长度的信息,那么我无法更新我的进度条。
假设您正在启动一个名为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;
}
}