Jak wyświetlać progres bar podczas deserializacji tabeli z pliku i wypełniania tabeli datagridview?
Edit: Znalazłem stronę http://msdn.microsoft.com/en-us/magazine/cc163515.aspx
public abstract class ContainerStream : Stream
{
private Stream _stream;
protected ContainerStream(Stream stream)
{
if (stream == null) throw new ArgumentNullException("stream");
_stream = stream;
}
protected Stream ContainedStream { get { return _stream; } }
public override bool CanRead { get { return _stream.CanRead; } }
public override bool CanSeek { get { return _stream.CanSeek; } }
public override bool CanWrite { get { return _stream.CanWrite; } }
public override void Flush() { _stream.Flush(); }
public override long Length { get { return _stream.Length; } }
public override long Position
{
get { return _stream.Position; }
set { _stream.Position = value; }
}
public override int Read(byte[] buffer, int offset, int count)
{
return _stream.Read(buffer, offset, count);
}
}
public class ReadProgressStream : ContainerStream
{
private int _lastProgress = 0;
public ReadProgressStream(Stream stream)
: base(stream)
{
if (!stream.CanRead || !stream.CanSeek || stream.Length <= 0)
throw new ArgumentException("stream");
}
public override int Read(byte[] buffer, int offset, int count)
{
int amountRead = base.Read(buffer, offset, count);
if (ProgressChanged != null)
{
int newProgress = (int)(Position * 100.0 / Length);
if (newProgress > _lastProgress)
{
_lastProgress = newProgress;
ProgressChanged(this,
new ProgressChangedEventArgs(_lastProgress, null));
}
}
return amountRead;
}
public event ProgressChangedEventHandler ProgressChanged;
public override long Seek(long offset, SeekOrigin origin)
{
throw new NotImplementedException();
}
public override void SetLength(long value)
{
throw new NotImplementedException();
}
public override void Write(byte[] buffer, int offset, int count)
{
throw new NotImplementedException();
}
}
public static T Deserialize<T>(
Stream stream, ProgressChangedEventHandler callback)
{
using (ReadProgressStream rps = new ReadProgressStream(stream))
{
rps.ProgressChanged += callback;
BinaryFormatter formatter = new BinaryFormatter();
return (T)formatter.Deserialize(rps);
}
}
public void setprogressbar1(object sender, ProgressChangedEventArgs e)
{
progressBar1.Value = e.ProgressPercentage;
}
użycie:
dt = Deserialize<DataTable>(myStream, new ProgressChangedEventHandler(setprogressbar1));
Dlaczego pasek ładuje się dużo wczesniej przed czasem załadowania pliku?
Edit 2: Pozostał jeszcze problem jak wyświetlać progressbar dla wczytywania tabeli.
Tabelę wczytuję tak:
dataGridView1.DataSource = dt.DefaultView;
myBindingSource.DataSource = dt;
Czy myBinding ma jakiegoś eventa który może do tego posłużyć?