Reputation: 151
I am Using following function to Add items.this function working proparly but it takes much time to execution.please help me to reduce the execution time of items add in listview.
Function:
listViewCollection.Clear();
listViewCollection.LargeImageList = imgList;
listViewCollection.LargeImageList.ImageSize = new System.Drawing.Size(100, 100);
foreach (var dr in Ringscode.Where(S => !S.IsSold))
{
listViewCollection.Items.Insert(0,
new ListViewItem(dr.CodeNo.ToString(), dr.RingID.ToString()));
imgList.Images.Add(dr.RingID.ToString(), binaryToImage(dr.Image));
}
public Image binaryToImage(System.Data.Linq.Binary binary)
{
byte[] b = binary.ToArray();
MemoryStream ms = new MemoryStream(b);
Image img = Image.FromStream(ms);
return img;
}
Upvotes: 0
Views: 141
Reputation: 6911
You need to expect that your UI is going to be slow if you do nonUI work in same thread (in your case, manipulating streams and images). Solution would be to offload this work to another thread, leaving UI thread to user. Once worker thread finishes, tell UI thread to do the update.
Second point is that when updating ListView data in batch, you should tell ListView to wait until you finish all manipulation.
Better if you do it like this. Commentary is inline.
// Create a method which will be executed in background thread,
// in order not to block UI
void StartListViewUpdate()
{
// First prepare the data you need to display
List<ListViewItem> newItems = new List<ListViewItem>();
foreach (var dr in Ringscode.Where(S => !S.IsSold))
{
newItems.Insert(0,
new ListViewItem(dr.CodeNo.ToString(), dr.RingID.ToString()));
imgList.Images.Add(dr.RingID.ToString(), binaryToImage(dr.Image));
}
// Tell ListView to execute UpdateListView method on UI thread
// and send needed parameters
listView.BeginInvoke(new UpdateListDelegate(UpdateListView), newItems);
}
// Create delegate definition for methods you need delegates for
public delegate void UpdateListDelegate(List<ListViewItem> newItems);
void UpdateListView(List<ListViewItem> newItems)
{
// Tell ListView not to update until you are finished with updating it's
// data source
listView.BeginUpdate();
// Replace the data
listViewCollection.Clear();
listViewCollection.LargeImageList = imgList;
listViewCollection.LargeImageList.ImageSize = new System.Drawing.Size(100, 100);
foreach (ListViewItem item in newItems)
listViewCollection.Add(item);
// Tell ListView it can now update
listView.EndUpdate();
}
// Somewhere in your code, spin off StartListViewUpdate on another thread
...
ThreadPool.QueueUserWorkItem(new WaitCallback(StartListViewUpdate));
...
You may need to fix a few things as I wrote this inline, and didn't test it in VS.
Upvotes: 1