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:
- Artikel erhalten ausgewählt und an info werfen zum Ziehen des Outlook.MailItem
- klar die ausgewählten Elemente aus der Liste
- 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)
- Anrufe aktualisieren
Update
- klar, dass die Elemente in der Listbox
- 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.
}
}
}`
Was ist die Ausnahme, erhalten Sie tatsächlich die Ausnahme von 'box.Items [e.Index];'? –
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) –