有没有人知道为什么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子。我通过使用制动点找到了这个。有谁知道为什么会出现这种情况以及如何解决这个问题?
谢谢,对此的任何帮助都将非常感激。
答案 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();
}
}
}