Свързване на CSV четец на трета страна с лента за напредък

Намерих добре написан 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?


person Edper    schedule 27.05.2013    source източник


Отговори (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;
    }
}
person loopedcode    schedule 27.05.2013
comment
Благодаря ти @loopedcode за твоя отговор. Опитах вашия код, но той дори не отиде до събитието timer_Tick (опитах се да го отстраня). Опитах се да направя интервала по-малък и без резултат. Но честно казано идеята ти е добра. - person Edper; 27.05.2013
comment
Виждам правописна грешка, липсва извикване на timer.Start(); - person loopedcode; 27.05.2013
comment
Актуализиран код, вижте дали работи. Ако все още не влезе в блока на таймера, вашият файл може да се чете много бързо. - person loopedcode; 27.05.2013
comment
Същият резултат. Но вие ми дадохте нещо, с което да започна и аз ви благодаря за това. - person Edper; 27.05.2013