列表框项目forecolor更改

时间:2013-07-29 10:54:12

标签: vb.net visual-studio-2010 listbox listboxitem

有没有人知道为什么Listbox1.Refresh()命令每次都不能触发ListBox1_DrawItem子?

在Microsoft Visual Basic 2010中,列表框具有forcolor和backcolor属性。这些属性会更改列表框中所有项目的forcolour和backcolor。默认情况下,列表框中的单个项目的forecolor和backcolor没有属性,我知道列表视图中有,但我仍然希望使用列表框。 我试图能够更改列表框中各个项目的forecolor和backcolor属性。 要执行此操作,必须使用列表框的绘图项子,并将列表框的drawmode属性设置为OwnerDrawFixed。然后使用画笔颜色和e.graphics可以改变前景色或背景色。 我已经看到并遵循了如何为当前所选项目执行此操作的示例。比如来自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是一个整数,当新项目添加到列表框时会递增,而blue_message是一个布尔值,当我想要蓝色消息时它是真的,而当我想要蓝色消息时它是假的别'吨。

我似乎遇到的问题是Listbox1.Refresh()命令似乎每次调用时都不会触发ListBox1_DrawItem子。我通过使用制动点找到了这个。有谁知道为什么会出现这种情况以及如何解决这个问题?

谢谢,对此的任何帮助都将非常感激。

1 个答案:

答案 0 :(得分:-1)

首先,我建议您使用后台工作程序而不是直接在UI线程上写下代码。

请参阅以下代码:

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();
        }
    }
}