选定ListView项目周围的矩形

时间:2014-11-19 11:01:32

标签: c# winforms

我想在ListView中围绕所选项目绘制一个矩形,因为在某处读取Microsoft建议不要更改所述项目的“突出显示颜色”。但是,我正在使用selectedIndexChanged事件,当绘制实际的listviewitem时,我的矩形消失了。一个有根据的猜测会建议我的矩形是在它后面还是在重绘时被清除?所以我的问题是,何时是实际绘制矩形的最佳时间,因为它是可见的?到目前为止我的代码可以在下面看到:

 void lvMain_SelectedIndexChanged(object sender, EventArgs e)
    {
        if (lvMain.SelectedItems.Count > 0)
        {
            if (lastSelectedItem == null) // First time called
            {
                lastSelectedItem = (sender as System.Windows.Forms.ListView).SelectedItems[0];
                DrawHighlightRectanlge(lastSelectedItem);
            }
            else
            {
                // TODO: Remove previous highlight
                lastSelectedItem = (sender as System.Windows.Forms.ListView).SelectedItems[0];
                DrawHighlightRectanlge(lastSelectedItem);
            }
        }
    }

    internal void DrawHighlightRectanlge(System.Windows.Forms.ListViewItem item)
    {
        using (Graphics g = item.ListView.CreateGraphics())
        {                
            g.DrawRectangle(new Pen(Color.Red), new Rectangle(item.Position.X, item.Position.Y, item.Bounds.Width, item.Bounds.Height));
        }
    }

TIA

1 个答案:

答案 0 :(得分:0)

以下是所有者绘制的ListView的基本版本。将OwnerDraw属性设置为true并对DrawItem事件进行编码,可能是这样的:

private void listView1_DrawItem(object sender, DrawListViewItemEventArgs e)
{
    e.DrawBackground();
    e.DrawText();

    if (e.Item.Selected)
    {
        Rectangle R = e.Bounds;  
        R.Inflate(-1, -1);
        using (Pen pen = new Pen(Color.Red, 1.5f))
        e.Graphics.DrawRectangle(pen, R);
    }
}

我将矩形缩小一点,使其在Details View中工作,但你应该四处玩,以使其适合你的需要和幻想......!

注意:如果您有ColumnHeaders,您还需要以{x}最简单的形式对DrawColumnHeader事件进行编码:

private void listView1_DrawColumnHeader(object sender, 
                                        DrawListViewColumnHeaderEventArgs e)
{
    e.DrawDefault = true;
}

如果你有SubItems,你需要有一个DrawSubItem事件,至少再次这样:

private void listView1_DrawSubItem(object sender, DrawListViewSubItemEventArgs e)
{
    e.DrawDefault = true;
}

如果您希望在此处绘制矩形,显然您需要为此事件编写更多代码。但此处也可以使用DrawBackgroundDrawText的默认功能。