This topic has not yet been rated - Rate this topic

ListView.DrawItem Event

Occurs when a ListView is drawn and the OwnerDraw property is set to true.

Namespace:  System.Windows.Forms
Assembly:  System.Windows.Forms (in System.Windows.Forms.dll)
public event DrawListViewItemEventHandler DrawItem

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


.NET Framework

Supported in: 4, 3.5, 3.0, 2.0

.NET Framework Client Profile

Supported in: 4, 3.5 SP1

Windows 7, Windows Vista SP1 or later, Windows XP SP3, Windows XP SP2 x64 Edition, Windows Server 2008 (Server Core not supported), Windows Server 2008 R2 (Server Core supported with SP1 or later), Windows Server 2003 SP2

The .NET Framework does not support all versions of every platform. For a list of the supported versions, see .NET Framework System Requirements.
Did you find this helpful?
(1500 characters remaining)
Community Content Add
Annotations FAQ
DrawListViewItemEventArgs bug
If running .NET 3.5 (vista 64) or earlier, DrawListViewItemEventArgs reports incorrect selection information, when set ListView.HideSelection property to fals.
Use:
e.Item.Selected
instead of
(e.State & ListViewItemStates.Selected) != 0)
DrawItem Parameter Clarification
The documentation for the ListBox DrawItem event fails to clearly document the 'sender' parameter; it fails to highlight the fact that in that event, the sender parameter refers to the parental control of the listitem it is requesting the developer to draw. Too many people I talk to are wondering aloud if it is supposed to be the actual ListItem object (Duh -- just try it and wait for the exception error). Granted, for me the idea that it is the parent object was given away by the fact that the DrawItemEventArgs parameter provides an Index property, and one simply has to wonder -- an index into what?. But this is not obvious to everyone. Indeed, the fact that the sender parameter is a reference to a ListBox or ComboBox is one of its most powerful features, because with that knowledge you can create individual generic handler events that can easily support legions of objects. We can Use DirectCast() to cast 'sender' to its original ListBox or ComboBox type (use sender.GetType.Name to discover sender's original type, such as "ListBox" or "ComboBox", for example), and we are off to the races.