TECHNOLOGIES
FORUMS
JOBS
BOOKS
EVENTS
INTERVIEWS
Live
MORE
LEARN
Training
CAREER
MEMBERS
VIDEOS
NEWS
BLOGS
Sign Up
Login
No unread comment.
View All Comments
No unread message.
View All Messages
No unread notification.
View All Notifications
Answers
Post
An Article
A Blog
A News
A Video
An EBook
An Interview Question
Ask Question
Forums
Monthly Leaders
Forum guidelines
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);
}
Reply
Answers (
2
)
Win Forms UDP application
C# select database based on combo box selection