65.9K
CodeProject is changing. Read more.
Home

Resizable ListBox

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.73/5 (8 votes)

Jan 27, 2004

1 min read

viewsIcon

76245

downloadIcon

2265

A standard ListBox redrawing correctly when it is resized.

Introduction

You know that ListBox is a very useful component for displaying your style list with ownerdraw method. If you are using VariableSize mode to draw ListBox item, I think it will be interesting to you. All works fine if you are not going to change a ListBox's horizontal size. When you try to change ListBox's horizontal size, ListBox calls Draw for each visible item again, but problem is that it is not calling MeasureItems and your ListBox does not look like as you want..

Background

The MeasureItem event is raised when you add a new item to the list. So it occurs only once for each item. I have not found any direct way to call MeasureItem forcedly.

There are some indirect ways to solve this problem.

One of them is full reimplementation of ListBox control. See in the article "An auto-resize C# ListBox" By Christian Tratz.

The second way is to remove all items and add them again; as a result MeasureItems will be recalled for each item again. But if you have many items in your ListBox, this way is not the best one. You may have performance problems.

My solution is that when you need ReMeasuringItem, call code like this:

//  Forced Call MeasureItems.
listBox1.DrawMode = System.Windows.Forms.DrawMode.OwnerDrawFixed;
listBox1.DrawMode = System.Windows.Forms.DrawMode.OwnerDrawVariable;
//

Using the code

Do not put this code in the ListBox resizing event. It will not work. Put it in ListBox's parent control. In my example, I put it in a form's event. For better performance, you may put it in SizeChanged event.

P.S. In my example, I demonstrate resizing ListBox by this way. In your code, you may wait until the form is resized and then allow to redraw ListBox items. Using this way, you will have better performance.