突出显示listBox中的多个项目/行

时间:2012-11-17 09:03:20

标签: c# .net c#-4.0 listbox

我有一个列表框,显示每行中(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)即使我运行代码,我收到如下错误信息:

enter image description here


第2版:

我遵循了NikolaD - Nick建议,但它确实有效!!!。但是有一小部分要解决,它没有显示lsBoxFeature中每一行的文本(PointF坐标)。

以下是现在的样子:

enter image description here

以下是输出的结果:

enter image description here

我怎么能在lsBoxFeature中取回行的tex?

1 个答案:

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