learner learner

learner learner

  • NA
  • 29
  • 155.5k

Add item to listview in backgroundworker without refreshing the listview

Feb 8 2012 1:24 PM
You cannot vote on your own post
0

I have loaded many images in a listview using ImageList in c#. When many many images are loaded then it takes a long time. So I call the method in backgroundworker. In the backgroundworker I had to add images to ImageList and add ImageList to ListView. So I have used safeinvoke() method listView1.SafeInvoke(d=>d.Items.Add(item)).
. Everything works fine. Images are displayed one by one in the listview. But the problem is the listview is continuously refreshing when a new item is added. This refreshing seems disturbing to the user. When I have added the item without using background worker (listView1.Items.Add(item)) then it worked fine. It was added one after another smoothly without refreshing. I want to add item without refreshing the listview.

Where is the problem? Is the problem of backgroundworker or the SafeInvoke () method? How to solve it?

sample code:
private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{

string[] fileNames = Directory.GetFiles(@"E:\Image");

foreach (string flName in fileNames)
{

Bitmap btmap = (Bitmap)Image.FromFile(flName);
scanNo++;

//imageList.Images.Add(newBtmap); when backgroundworker was not used

this.SafeInvoke(d=>d.imageList.Images.Add(newBtmap));

ListViewItem item;
item = new ListViewItem();
item.ImageIndex = scanNo - 1;
item.Text = scanNo.ToString();

// listView1.Items.Add(item); when backgroundworker was not used

listView1.SafeInvoke(d=>d.Items.Add(item));

}

}

http://www.codeproject.com/Articles/52752/Updating-Your-Form-from-Another-Thread-without-Cre?msg=4151406#xx4151406xx

public static TResult SafeInvoke<T, TResult>(this T isi, Func<T, TResult> call) where T : ISynchronizeInvoke
{
if (isi.InvokeRequired) {
IAsyncResult result = isi.BeginInvoke(call, new object[] { isi });
object endResult = isi.EndInvoke(result); return (TResult)endResult;
}
else
return call(isi);
}

public static void SafeInvoke<T>(this T isi, Action<T> call) where T : ISynchronizeInvoke
{
if (isi.InvokeRequired) isi.BeginInvoke(call, new object[] { isi });
else
call(isi);
}

Answers (2)