我从Sebastien Lorion写的link找到了一个写得很好的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的最佳方法是什么?
答案 0 :(得分: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;
}
}