TIP: Changing the Selected Item's Backcolor in a ListBox

Recently, I ran across an issue where I needed to control the background color of the selected items in a Windows Forms ListBox control. Imagine my surprise when I discovered that not only was such a capability not present in the properties, but that the authors of the control seemed to go out of their way to make it difficult to do so. It may be that they had valid reasons for doing it this way, but I fail to see them. That being said, this is the solution I found. It is simple and straightforward, but took a little time to track it down.

I realized that I had to get involved in the item drawing process, so the first thing was to set the control to Owner drawn and write the event handler for the DrawItem event. I won't go into the details of writing a DrawItem event handler because that is topic is amply covered by others, so I'll simply show the lines that need to be placed at the start of the DrawItem method. My first thought was that I could simply test to see whetherf it was a selected item and instruct the DrawBackground method to use my BackColor if true.

Well, problem number one! The DrawBackground() method of the DrawItemEventArgs takes no parameters and there are no overrides. Hmmm, this means that it is using the BackColor property of the DrawItemEventArgs object.

Okay, let me change that... Whoops, no dice. They made it readonly for no apparent reason. I'll step around that issue by creating a new DrawItemEventArgs using the original's properties and changing the BackColor in the constructor. So far, so good...

if ((e.State & DrawItemState.Selected) == DrawItemState.Selected)
   e = new DrawItemEventArgs(e.Graphics, e.Font, e.Bounds, e.Index,
                             e.State, e.ForeColor, Color.Red);

Nope, it's still drawing using the 'Highlight' named color. Apparently, the DrawBackground method is ignoring the BackColor property when it's a selected item, even though the control does set the BackColor to 'HighLight' for selected item(s)...

Okay, I verified that if it's not a selected item, the above code changes the BackColor as hoped, so now I need to fool the DrawBackground() method so it doesn't see an item as selected.

if ((e.State & DrawItemState.Selected) == DrawItemState.Selected)
   e = new DrawItemEventArgs(e.Graphics, e.Font, e.Bounds, e.Index,
                             e.State ^ DrawItemState.Selected,
                             e.ForeColor, Color.Red);

Success!!!!

By XORing(^) the current State bitmask with the DrawItemState.Selected flag, I have fooled the DrawBackground() method into thinking that it is a normal item and it uses the Backcolor I specified.

I hope this helps.



About the Author

Eric Latham

Began developing in C on a Tandy Color Computer in 1978 (good old 6809E processer, those were the days :) ) which I had to hand solder to get 16k ram. Took up C++ and then C# in turn. Been developing business apps for various companies for the last 20+ years.

Comments

  • There are no comments yet. Be the first to comment!

Leave a Comment
  • Your email address will not be published. All fields are required.

Top White Papers and Webcasts

  • Complex hybrid environments can make it difficult to track interdependencies, increasing the risk of disrupting critical business services. In this white paper by EMA, you'll learn how application discovery and dependency mapping can help you: Meet granular targets for availability, cost, and time-to-revenue for cloud services. Accelerate mean time to repair (MTTR) while communicating better with stakeholders. Manage even the most complex hybrid environments more efficiently and effectively Understand the …

  • Following an IT incident through to resolution is more than just acknowledging an alert and restarting a server. The recent State of On-Call Report found that it takes most companies an average of 10-30 minutes to resolve an incident with an average of 5 people involved. Imagine how much money and time companies are spending to deal with incident resolution. But what if you had a tool that offered solutions baked in? Or a tool that sent alerts to the right person or team every time? These are the kind of …

Most Popular Programming Stories

More for Developers

RSS Feeds

Thanks for your registration, follow us on our social networks to keep up-to-date