Avatar billede thomasabcd Nybegynder
10. maj 2006 - 00:51 Der er 1 løsning

GUI hænger (listview)

Hej eksperter,

Jeg har et listview,som opdateres, når der kommer en ny besked (beskeden kommer som en xml-fil, som læses), og når beskeden er håndteret. Det går fint med at opdatere mit listview hvis der ikke kommer så mange beskeder på én gang. Jeg prøvede så at fyre 1000 beskeder afsted på én gang, men det kunne listviewet ikke lide. Så begyndte GUIen at hænge. Jeg benytter begininvoke og delegates til at opdatere listviewet, men det hænger alligevel. Nogen idéer ?

Nedenfor er min kode:

/// <summary>
/// Update listview when a new message is received
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
void incoming_MessageReceived(object sender, MessageReceivedEventArgs e)
{
if (messagesListView.InvokeRequired)
{
IAsyncResult res= this.messagesListView.BeginInvoke(new   
UpdateIncomingMessageHandler(incoming_MessageReceived), new
object[] { sender, e });
}
else
{
  lock (incoming_MessageReceivedLock)
  {
  //add new entry to the listview
  ListViewItem item = new ListViewItem(e.ToString());
  item.Name = e.UniqueID.ToString();
  item.SubItems.Add(DateTime.Now.ToString());
  item.SubItems.Add(e.Message.ToString());

    if (e.HandlingDone == true)
    {
    item.SubItems.Add(e.HandledSuccesfully.ToString());
    item.SubItems.Add(e.ErrorMessage);
    }
    else
    {
      item.SubItems.Add("Handling in progress");
      item.SubItems.Add("Handling in progress");
      }

    item.SubItems.Add(e.ToFormattedString());

    //update the item in the listview if it is already   
    //present otherwise add item
    if (messagesListView.Items.ContainsKey(item.Name) == true)
    {
    //retrieve the existing item and it's position (index) in the 
    //listview
      ListViewItem existingItem=messagesListView.Items[item.Name];

    //if the original item was selected, so should the new item be
    bool existingItemIsSelected = existingItem.Selected;
    if (existingItemIsSelected == true)
    item.Selected = true;

    //replace the original item
    int index = messagesListView.Items.IndexOf(existingItem);
    messagesListView.Items.Insert(index, item);
                       
    messagesListView.Items.Remove(existingItem);
    }
    else
    messagesListView.Items.Add(item);

    //update number of handled messages
    incomingListGroupBox.Text = "Incoming messages(" +
    messagesListView.Items.Count.ToString() + ")";
  }
  }
}
Avatar billede thomasabcd Nybegynder
10. maj 2006 - 01:37 #1
Det, der tager tid, er at finde et item, hvis det skal opdateres. Så istedet laver jeg to listviews. Ét med dem, der er i gang med at blive behandlet og ét med dem, der er behandlet.Det ser ud til at løse det
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester