我有一个列表框,显示每行中(X,Y)的某些位置。
用户可以在某个文本框中输入一些(X,Y)对,然后按下按钮。
现在我想做的是:每次用户输入3或4(X,Y)对时,我的算法会找到匹配的对,并且那些对应的对应该突出显示(假设有粉红色/红色/任何颜色)同时在列表框中一起。
如何用我想要的颜色突出显示那些对(相同的索引)?
第1版:
在NikolaD - Nick指导下,我将DrawMode更改为 OwnerDrawVariable ,在lsBoxFeature_DrawItem方法中,我添加了以下代码:
private void lsBoxFeature_DrawItem(object sender, DrawItemEventArgs e)
{
e.DrawFocusRectangle();
Bitmap bmp = new Bitmap(e.Bounds.Width, e.Bounds.Height);
Graphics g = Graphics.FromImage(bmp);
foreach (var item in globalDataForAllMatchedFrames[globalDataForAllMatchedFrames.Count - 1].featureNumber)
{
if (lsBoxFeature.Items[e.Index].Equals(item))//your method that determines should current item be highlighted
{
g.Clear(Color.Red);
}
else
{
g.Clear(lsBoxFeature.BackColor);
}
g.DrawString(lsBoxFeature.Items[e.Index].ToString(), lsBoxFeature.Font, new SolidBrush(lsBoxFeature.ForeColor), e.Bounds);
e.Graphics.DrawImage(bmp, e.Bounds);
g.Dispose();
}
}
item是一个PointF对象,现在每次该项等于listBoxFeature中的那些成员时,它应该用红色突出显示它们。
有两个问题:
I)似乎是方法.Equals在if-condition中无法正常工作以检查pointF项是否等于listBoxFeature中的成员===>因此,我的listBoxFeature
中没有显示任何内容II)即使我运行代码,我收到如下错误信息:
第2版:
我遵循了NikolaD - Nick建议,但它确实有效!!!。但是有一小部分要解决,它没有显示lsBoxFeature中每一行的文本(PointF坐标)。
以下是现在的样子:
以下是输出的结果:
我怎么能在lsBoxFeature中取回行的tex?
答案 0 :(得分:3)
您应该添加ListView
的{{1}}事件处理程序,并在检查哪个DrawItem
应该着色时绘制突出显示。像这样:
Items
检查此问题,您可以更详细地了解如何执行此操作:How do i add same string to a ListBox in some lines?
**编辑:**此编辑是在您编辑问题之后。为listBox中的每个项调用lsBoxFeature_DrawItem事件处理程序,而不是为所有项调用。第一个问题是对象调用Equals()方法(ListBox中的Item是对象)有效地比较了其他对象的引用,而不是PointF的值。第二个问题是你放置了Graphic对象,然后调用了g.Clear()在被处置物上。我已经重写了你的代码,我认为它现在可以正常工作。
private void listBox1_DrawItem(object sender, DrawItemEventArgs e)
{
e.DrawFocusRectangle();
Bitmap bmp = new Bitmap(e.Bounds.Width, e.Bounds.Height);
Graphics g = Graphics.FromImage(bmp);
if (MeetsCriterion(listBox1.Items[e.Index]))//your method that determines should current item be highlighted
{
g.Clear(Color.Red);
}
else
{
g.Clear(listBox1.BackColor);
}
g.DrawString(listBox1.Items[e.Index].ToString() , listBox1.Font, new SolidBrush(listBox1.ForeColor), e.Bounds);
e.Graphics.DrawImage(bmp, e.Bounds);
g.Dispose();
}