ListView.DrawItem Event
Assembly: System.Windows.Forms (in system.windows.forms.dll)
This event lets you customize the appearance of a ListView control using owner drawing. It is raised only when the OwnerDraw property is set to true. For more information on owner drawing, see the OwnerDraw property reference topic.
The DrawItem event can occur for each ListView item. When the View property is set to View.Details, the DrawSubItem and DrawColumnHeader events also occur. In this case, you can handle the DrawItem event to draw elements common to all items, such as the background, and handle the DrawSubItem event to draw elements for individual subitems, such as text values. You can also draw all items in the ListView control using only one of the two events, although this may be less convenient. To draw column headers in the details view, you must handle the DrawColumnHeader event.
Note: |
|---|
| Because of a bug in the underlying Win32 control, the DrawItem event occurs without accompanying DrawSubItem events once per row in the details view when the mouse pointer moves over the row, causing anything painted in a DrawSubItem event handler to be painted over by a custom background drawn in a DrawItem event handler. See the example in the OwnerDraw reference topic for a workaround that invalidates each row when the extra event occurs. An alternative workaround is to put all your custom drawing code in a DrawSubItem event handler and paint the background for the entire item (including subitems) only when the DrawListViewSubItemEventArgs.ColumnIndex value is 0. |
For more information about handling events, see Consuming Events.
The following code example provides an implementation of a DrawItem event handler. For the complete example, see the OwnerDraw reference topic.
// Draws the backgrounds for entire ListView items. private void listView1_DrawItem(object sender, DrawListViewItemEventArgs e) { if ((e.State & ListViewItemStates.Selected) != 0) { // Draw the background and focus rectangle for a selected item. e.Graphics.FillRectangle(Brushes.Maroon, e.Bounds); e.DrawFocusRectangle(); } else { // Draw the background for an unselected item. using (LinearGradientBrush brush = new LinearGradientBrush(e.Bounds, Color.Orange, Color.Maroon, LinearGradientMode.Horizontal)) { e.Graphics.FillRectangle(brush, e.Bounds); } } // Draw the item text for views other than the Details view. if (listView1.View != View.Details) { e.DrawText(); } }
// Draws the backgrounds for the column header row and for entire
// ListView items.
private void myListView_DrawItem(Object sender, DrawListViewItemEventArgs e)
{
// Draw the background for the column header row.
if (e.get_ItemIndex() == -1) {
e.get_Item().set_BackColor(Color.get_Black());
e.DrawBackground();
}
// Draw the background for a selected item.
else {
if (Convert.ToInt32((e.get_State() & ListViewItemStates.Selected))
!= 0) {
e.get_Graphics().FillRectangle(Brushes.get_Maroon(),
e.get_Bounds());
e.DrawFocusRectangle();
}
// Draw the background for an unselected item.
else {
LinearGradientBrush myBrush = new LinearGradientBrush(
e.get_Bounds(), Color.get_Orange(), Color.get_Maroon(),
LinearGradientMode.Horizontal);
try {
e.get_Graphics().FillRectangle(myBrush, e.get_Bounds());
}
finally {
myBrush.Dispose();
}
}
}
// Draw the item text for views other than the Details view.
if (!(((ListView)sender).get_View().Equals(View.Details))) {
e.DrawText();
}
} //myListView_DrawItem
Windows 98, Windows Server 2000 SP4, Windows CE, Windows Millennium Edition, Windows Mobile for Pocket PC, Windows Mobile for Smartphone, Windows Server 2003, Windows XP Media Center Edition, Windows XP Professional x64 Edition, Windows XP SP2, Windows XP Starter Edition
The Microsoft .NET Framework 3.0 is supported on Windows Vista, Microsoft Windows XP SP2, and Windows Server 2003 SP1.
Note: