在我的WinForms应用程序中,我有一个计时器,它每秒都会'滴答'。在这个计时器的记号方法中,我做了各种事情,包括将项目添加到列表框(称为lbxLogText
)。添加项目时DrawItem事件被调用的次数过多
我需要选择某些项目的文本颜色(颜色是在添加项目之前决定的)。正因为如此,我已经设置了DrawMode属性来OwnerDrawVariable和lbxLogText_DrawItem
方法是这样的:
private void lbxLogText_DrawItem(object sender, DrawItemEventArgs e)
{
e.DrawBackground();
e.DrawFocusRectangle();
e.Graphics.DrawString(logStringToAdd,
new Font(FontFamily.GenericSansSerif, 8),
new SolidBrush(logStringToAddColor), e.Bounds);
testCounter++;
label29.Text = testCounter.ToString();
}
logStringToAdd
:全球string
。
logStringToAddColor
:全球Color
- 红色或黑色。
testCounter
:全球int
,开始为0
我有一个名为Log()
方法。这在上面提到的定时器的tick-method中被调用。
这是它的样子:
private void Log(string status)
{
// |red, |black
if (status != null)
{
if (status.Contains("|red"))
{
status = status.Replace("|red", "");
logStringToAddColor = Color.Red;
}
else if (status.Contains("|black"))
{
status = status.Replace("|black", "");
logStringToAddColor = Color.Black;
}
logStringToAdd = status;
lbxLogText.Items.Add(new object());
}
// scroll to bottom
lbxLogText.SetSelected(lbxLogText.Items.Count - 1, true);
lbxLogText.SetSelected(lbxLogText.Items.Count - 1, false);
}
status
:可能是“系统工作正常|黑”,或“系统工作不正常|红。”(例如)。此参数在Log-call(当然)之前更新。
此代码在某种程度上正常工作。我有以下问题:
运行程序时,我可以
label29
看到testCounter
变量不只是递增每一秒,就好像它从1开始,然后变成3,然后6,10, 15,21,28,36(我认为你现在已经习惯了)。这意味着DrawItem事件被称为更多而不是每秒。比如说
status
从“asd123 | black”变为“qwe456 | red”。这意味着添加到列表框的下一个项目应该是红色的。那么,它确实变成了红色,但是列表框中的所有项都变成了红色。并且所有项目的文本也被更改为最新的。调试时,我可以看到,当调用
SetSelected
方法时,它直接进入DrawItem事件方法。但是我不明白我该如何避免这种情况,因为当添加一个新项目时,我需要列表框滚动到底部,因此最新的项目是可见的。
谢谢迪安娜,这就像一个魅力。 – eightx2