Introduction

Ever wanted to have a lightweight list box control for your Windows Forms application to list custom items, for example, to list picture albums in a nice way - with an album front image, album name and details, like how many photos in an album, etc.? I was always disappointed with DataGridView, it's a good component in some cases, but usually you just need a nice, clear list, that's why I came up with this extended exListBox.

Background

I think everybody has noticed that the standard Windows Forms ListBox item is an object type, not a string. If you will try to pass your business object to ListBox.Items, it won't understand how you would like it to be displayed and will just print out your object's class name. But there's a solution - to override the OnDrawItem event, and placing your own drawing procedure. By the way, I was trying to keep the code as short as possible and as easy to understand as possible, so in that way, I didn't implemented real data binding, some constructors/properties aren't in the right places, and so on.

Using the code

There are two classes that you'll need - exListBox and exListBoxItem. The first one is derived from ListBox just to override the OnDrawItem event, though you could do this without creating a separate class, by simply handling the onDrawItem event in your form source code, but if you'll use the extended ListBox on several forms, it's better for sure to place the code on a separate code file. The second class (exListBoxItem) is created from scratch, it has its drawing procedure and the elements that need to show up on the list. On the current example, an item contains an image, item title, and item details, but you can easily extend exListBoxItem with your own code and have your own elements.

As you can see, I've placed one more variable to exListBoxItem - id, it should help you bind exListBox with your databases. I didn't make any real data binding to keep the code small, easy to understand, and in an easy edit-to-fit-your-needs form.

If you change the drawing procedure, you should take care of a few things. First of all, you need to check if the item which you will be drawing is selected or not. As you can see from the method title, I’m taking info about the selected item in DrawItemEventArgs. Here, I can find if the item is selected or not and the item bounds where I must draw the item. All other arguments are necessary only in my case. If your exListBoxItem contains other elements, it may look a bit different.

History

1.0 - Article showed up.

License

This article has no explicit license attached to it but may contain usage terms in the article text or the download files themselves. If in doubt please contact the author via the discussion board below.

At last someone who overrided the listbox behavior and shared the knowledge!I google this thing two days now, and what I find is trash in comparison to your code, your details on OnDrawItem, onPaint, and how to draw with drawItem.

it should work on 1.0 framework too, all you need to do is create empty project and using notepad copy paste my source to your empty project.i think problem is, that i've created this project with VS2005 and VS2003 or older can't understand how to open it.you can read about drawing listbox items by our own here:http://msdn2.microsoft.com/en-us/library/system.windows.forms.listbox.objectcollection.aspx

Thank for your answer but, even if i cut and paste your file in new project.Any error show me by VS2003.May be can you compil and share your controls but from VS 2003.Your listBox is very interesante for me and i want to update for use in my project.Thx.Rodcobalt22

This code will let you the ability to add any kind of control into your list box.. But, be aware that you won't be able to click on them and let them handle the click (ex : add a button as an item, define click event for the button, it won't be reached when selecting the button through the listbox)...

If I had to do kind of control like this, I'll maybe will prefer a Panelwith AutoScroll property Set to yes... and use Controls.Add(..) to be ableto handle a collection of Usercontrol for instance...

Is there a way to set the item height to anything bigger than 255 ?I've noticed this behaviour in many listboxes.As far as i know it's related to windows using only 1 byte to store the height, but i would really like to overwrite this height somehow.