选定ListView项周围的矩形

我想在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

这是所有者绘制的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工作,但你应该四处玩,以使其适合您的需求和幻想..!

注意:如果您有DrawColumnHeader ,您还需要以最简单的forms对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的默认函数。