2017-03-06 4 views
1

Ich arbeite an einer Anwendung, die einen Bericht für E-Mails anzeigt, die in einem Outlook-Postfach eingehen. Ich hatte es mit einem reichhaltigen Textfeld eingerichtet, um die Vorder- oder Hintergrundfarbe des Textes entsprechend dem E-Mail-Typ zu formatieren. Ich wollte Funktionalität für Benutzer hinzufügen, um eine E-Mail von der Anzeige auszuwählen.Listbox-Funktionalität, mit RichText-Formatierung

Einfach genug verwenden Sie eine Listbox ... aber behalten Sie die Formatierung ... machen Sie es zu einem Besitzer-gezogen-feste ListBox.

die meiste Zeit das funktioniert gut; bis der Benutzer versucht, die E-Mail auszuwählen.

hier ist das, was

On Klicken Sie doppelt passiert:

  1. Artikel erhalten ausgewählt und an info werfen zum Ziehen des Outlook.MailItem
  2. klar die ausgewählten Elemente aus der Liste
  3. tun was auch immer an die E-Mail-Nachricht (an eine andere Funktion übergeben, wobei der Benutzer wählt, was er/sie tun möchte)
  4. Anrufe aktualisieren

Update

  1. klar, dass die Elemente in der Listbox
  2. die E-Mails ziehen und fügen Sie sie zurück in die ListBox

Irgendwo in der Aktualisierung, die Anwendung abstürzt und Ich bin mir nicht sicher warum. Wenn der Bericht als Teil des "normalen" Anwendungsprozesses aufgerufen wird, lädt er sich gut, er wird nur gesperrt, wenn er nach einer Benutzerinteraktion aufgerufen wird.

75% der Zeit, keiner der Fehlerbehandler, die ich habe, Catch (exception e2) aufgerufen werden. Gelegentlich erhalte ich jedoch einen Indexfehler, der den Wert -1 liefert.

Logischerweise, wenn es in einem Fall funktioniert, sollte es in der Sekunde funktionieren, aber Beweise zeigen, dass dies nicht der Fall ist.

Haben Sie Vorschläge, wo Sie nach dem Fehler suchen können, oder nach einem anderen Weg, um das gleiche Ziel zu erreichen?

 private void listBox_DrawItem(object sender, DrawItemEventArgs e) 
    { 
     e.DrawBackground(); 
     Graphics g = e.Graphics; 
     SolidBrush textColor = new SolidBrush(Color.Black); 
     SolidBrush backColor = new SolidBrush(Color.White); 
     try 
     { 
      ListBox box = (ListBox)sender; 
      mailInfo email = (mailInfo)box.Items[e.Index]; 
      switch (email.getTypeCode())//based on the e-mail type formats the line 
      { 
       case 1:// ejected 
        textColor = new SolidBrush(Color.LightGray); 
        backColor = new SolidBrush(Color.White); 
        break; 
       case 2://Multi volume 
        textColor = new SolidBrush(Color.SteelBlue); 
        backColor = new SolidBrush(Color.White); 
        break; 
       case 0://success 
        textColor = new SolidBrush(Color.DarkGreen); 
        backColor = new SolidBrush(Color.White); 
        break; 
       case -3://not inserted 
        textColor = new SolidBrush(Color.LightSalmon); 
        backColor = new SolidBrush(Color.White); 
        break; 
       case -2:// not scratch 
       case -1:// fail 
       case -4:// write portected 
       case -5:// not in DB 
        textColor = new SolidBrush(Color.White); 
        backColor = new SolidBrush(Color.Red); 
        break; 
       default: 
        textColor = new SolidBrush(Color.Black); 
        backColor = new SolidBrush(Color.White); 
        break; 
      } 
     } 
     catch (Exception e2) { MessageBox.Show(e2.Message + "\n\ncode\n" + e2.StackTrace, e2.GetType().ToString()); } 
     g.FillRectangle(backColor, e.Bounds); 
     if(e.State == DrawItemState.Selected) { 
      g.DrawString(((ListBox)sender).Items[e.Index].ToString(), e.Font, SystemBrushes.MenuHighlight,new PointF(e.Bounds.X, e.Bounds.Y)); } 
     else { 
      g.DrawString(((ListBox)sender).Items[e.Index].ToString(), e.Font, textColor, new PointF(e.Bounds.X, e.Bounds.Y)); 
     } 
     e.DrawFocusRectangle(); 

    } 


    private void lstEmail_DoubleClick_1(object sender, EventArgs e) 
    { 
     mailInfo email = (mailInfo) lstEmail.SelectedItem; 
     lstEmail.ClearSelected(); 
     frmEmailSelectedOptions userAction = new frmEmailSelectedOptions(); 
     userAction.ShowDialog(this); 
     switch (userAction.value) 
     { 
      case 0://ignore 
       // allow function to close, no action neededd 
       break; 
      case 1://read/unread 
      case 2://open 
       data.performEmailAction(email,userAction.value); 
       MessageBox.Show(userAction.value.ToString()); 
       break; 
      case 3://filter 
       this.filter = new mailFilter(email.getHost().getName(), email.getJobName()); 
       updateEmailList(); 
       break; 
     } 
    }public void updateEmailList()/***/ 
    { 
     lstEmail.Items.Clear(); 
     txtFilter.Text = filter.ToString();// updates the fileter display to the current filter 
     List<mailInfo> emails = data.getMail();// pulls the e-mails from the application memory 
     if (!btnSortByTime.Checked)//checks if the data needs to be re-sorted 
     { 
      emails.Sort((x, y) => x.getHost().getOrder().CompareTo(y.getHost().getOrder())); 
     } 
     foreach (mailInfo email in emails)//iterates over each e-mail in the application memory 
     { 
      if (displayEmail(email))//checks if the e-mails passes all the criteria 
      { 

       lstEmail.Items.Add(email);//adds the e-mail to the list, plus a line return for the next e-mail. 
      } 
     } 
    }` 
+0

Was ist die Ausnahme, erhalten Sie tatsächlich die Ausnahme von 'box.Items [e.Index];'? –

+0

InvalidArgument = Wert von '-1' ist nicht gültig für 'Index'. Parametername: Index bei System.Windows.FormsListBox.ObjectCollection.get_Item (Int32-Index) bei [...] frmMain.listbox_DrawItem (Objekt Absender, DrawItemEventArgs e) –

Antwort

0

Problem wurde behoben, indem überprüft wurde, ob die Listbox den Fokus hatte. Wenn das Listenfeld den Fokus hat, habe ich ein anderes Steuerelement ausgewählt. Wenn nicht, verlasse den Fokus so wie er ist. Dies hat das Problem behoben.