2013-07-29 4 views
0

Кто-нибудь знает, почему команда Listbox1.Refresh() не может запускать SubBox1_DrawItem каждый раз?listbox item forecolor change

В Microsoft Visual Basic 2010 список имеет свойство forcolor и backcolor. Эти свойства изменяют цвета forcolour и backcolor для всех элементов в списке. По умолчанию нет свойства для forecolor и backcolor отдельного элемента в списке, я знаю, что есть в представлении списка, но я все равно хотел бы использовать список. Я пытаюсь изменить свойства forecolor и backcolor отдельных элементов в списке. Для этого необходимо, чтобы атрибут drawbode списка был использован с атрибутом drawmode списка, установленным в OwnerDrawFixed. Затем, используя цвет кисти вместе с графикой, можно изменить цвет forecolor или backcolor. Я видел и приводил примеры того, как это сделать для выбранного в данный момент элемента. Например, от ehow's website. Тем, что я устал делать, это изменить цвет элемента litsbox, поскольку он добавляется в зависимости от переменной.

Вот мой код:

Private Sub listbox_add() 

     Me.ListBox1.Items.Add(listbox_text(list_num)) ' adds the line to the list box 
     add_item_colour = True 
     ListBox1.Refresh() 

End Sub 



    Private Sub ListBox1_DrawItem(ByVal sender As Object, ByVal e As System.Windows.Forms.DrawItemEventArgs) Handles ListBox1.DrawItem 
    Dim myBrush As Brush = Brushes.Black 

    e.DrawBackground() 
    If add_item_colour = True Then 
     If blue_message = True Then 
      myBrush = Brushes.Blue 
     Else 
      myBrush = Brushes.Black 
     End If 
     e.Graphics.DrawString(ListBox1.Items.Item(list_num), ListBox1.Font, myBrush, _ 
     New RectangleF(e.Bounds.X, e.Bounds.Y, e.Bounds.Width, e.Bounds.Height)) 
     add_item_colour = False 
    End If 
    e.DrawFocusRectangle() 
End Sub 

listbox_text является массив строк, который хранит строку добавляемого list_num представляет собой целое число, которое увеличивает при добавлении новых элементов в ListBox и blue_message булева что это правда, когда я хочу синее сообщение и ложь, когда я этого не сделаю.

Проблема, с которой я, кажется, сталкиваюсь, заключается в том, что команда Listbox1.Refresh(), кажется, не запускает SubBox1_DrawItem при каждом вызове. Я нашел это, используя тормозные точки. Кто-нибудь знает, почему это может быть так и как я могу это исправить?

Спасибо, любая помощь по этому поводу будет очень признательна.

ответ

-1

Прежде всего, я предлагаю вам использовать фоновый рабочий вместо прямого написания кода в потоке пользовательского интерфейса.

Пожалуйста, обратитесь код ниже:

public partial class Form1 : Form 
{ 
    Brush myBrush = Brushes.Blue; 
    public Form1() 
    { 
     InitializeComponent(); 
     this.backgroundWorker1.DoWork += backgroundWorker1_DoWork; 
     this.backgroundWorker1.RunWorkerCompleted += backgroundWorker1_RunWorkerCompleted; 
     this.backgroundWorker1.RunWorkerAsync(this); 
    } 

    private void listBox1_DrawItem(object sender, DrawItemEventArgs e) 
    { 
     e.DrawBackground(); 
     e.Graphics.DrawString(listBox1.Items[e.Index].ToString(), listBox1.Font, myBrush, new RectangleF(e.Bounds.X, e.Bounds.Y, e.Bounds.Width, e.Bounds.Height)); 
     e.DrawFocusRectangle(); 
    } 

    private void button1_Click(object sender, EventArgs e) 
    { 
     this.backgroundWorker1.RunWorkerAsync(button1); 
    } 

    private void button2_Click(object sender, EventArgs e) 
    { 
     this.backgroundWorker1.RunWorkerAsync(button2); 
    } 

    void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) 
    { 
     this.listBox1.Refresh(); 
    } 

    void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e) 
    { 
     if (e.Argument == this) 
     { 
      listBox1.Items.Add("p1"); 
      listBox1.Items.Add("p2"); 
     } 
     else if (e.Argument == this.button1) 
     { 
      myBrush = Brushes.Red; 
      listBox1.Refresh(); 
     } 
     else if (e.Argument == this.button2) 
     { 
      myBrush = Brushes.Green; 

      if (listBox1.SelectedItem == null) 
       return; 

      var test = listBox1.Items[listBox1.SelectedIndex]; 
      listBox1.SelectedItem = test; 
      var g = listBox1.CreateGraphics(); 
      var rect = listBox1.GetItemRectangle(listBox1.SelectedIndex); 
      listBox1_DrawItem(listBox1, new DrawItemEventArgs(g, this.Font, rect, listBox1.SelectedIndex, DrawItemState.Default)); 
      listBox1.Refresh(); 
     } 
    } 
} 
+0

Спасибо за ваш ответ, я, безусловно, дать ваш код попробовать. Однако я не упомянул о том, что этот listbox_add sub будет вызван только из нового потока, но он использует метод New System.Threading.Thread (AddressOf и Thread.Start() не фоновый рабочий, я не упоминал это потому, что это не было релевантно. – josh

+0

Также я пытаюсь достичь ситуации, когда цвет изменяется при добавлении элемента, поэтому переменная list_num отслеживает ранее добавленную. Простите меня, если я ошибаюсь но похоже, что ваш код зависит от выбранного элемента списка. – josh

+0

Да, вы правы, код, который я предоставил, - это всего лишь пример обновления списка при использовании фонового работника. Вам обязательно нужно внести изменения в соответствии с вашими требованиями. –