954,529 Members — Technology Publication meets Social Media
Username:
Password:
Lost login information?
Have something to say? Contribute New Article Reply to this Article

add item to listview in backgroundworker without refreshing the listview

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);
        }
sah
Newbie Poster
19 posts since Jan 2008
Reputation Points: 10
Solved Threads: 0
 
NetDeveloper
Newbie Poster
5 posts since Feb 2012
Reputation Points: 10
Solved Threads: 1
 

try ajax with web service or ajax with wcf

mani-hellboy
Junior Poster in Training
69 posts since Feb 2012
Reputation Points: 0
Solved Threads: 7
 

This article has been dead for over three months

Post: Markdown Syntax: Formatting Help
You
View similar articles that have also been tagged: