列表框功能,具有RichText格式

时间:2017-03-06 16:41:33

标签: c# listbox background-color ownerdrawn

我正在开发一个应用程序,显示进入Outlook邮箱的电子邮件报告。我用丰富的文本框设置了它,根据电子邮件类型格式化文本的前色或背色。我想为用户添加功能,以便从显示器中选择电子邮件。

足够简单使用列表框...但保持格式化...使其成为所有者绘制的固定列表框。

大部分时间这都很好;直到用户尝试选择电子邮件。

这是发生的事情

双击:

  1. 获取所选项目并转换为信息以拉出outlook.mailItem
  2. 清除列表中的所选项目
  3. 对邮件项目做任何事情(传递到另一个函数,在那里 用户选择他/她想做的事情)
  4. 致电更新
  5. 更新

    1. 清除列表框中的项目
    2. 拉出电子邮件并将其添加回listBox
    3. 在更新的某个地方,应用程序锁定,我不知道为什么。当作为“正常”应用程序进程的一部分调用时,报告加载得很好,只有在用户交互后调用时才会锁定。

      75%的时间,我没有调用Catch (exception e2)的错误处理程序。但是,偶尔我会得到索引错误,抛出值为-1。

      逻辑上,如果它在一种情况下有效,它应该在第二种情况下工作,但证据表明情况并非如此。

      有关在何处查找错误或不同的任何建议探索的途径是为了达到同样的目标吗?

              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.
                  }
              }
          }`
      

1 个答案:

答案 0 :(得分:0)

通过检查列表框是否具有焦点来解决问题。如果列表框具有焦点,我选择了另一个控件。如果不按原样保留焦点。这解决了这个问题。