I want to change the Item's/Row's height in listview.
I searched every where and I figured that in order to change the height I need to use LBS_OWNERDRAWFIXED
or MeasureItem
or something like that.
The problem is that I dont know exactly what to do and how to use it..
Can anyone help me with it?
Edit:
I cant use the ImageList hack because I am using the SmallImageList for real and I need different line height from the ImageList images size.
Thanks!
Sadly nobody answered your original question how to use
LBS_OWNERDRAWFIXED
in all these years.The answer that you have accepted is integrating a huge project (with demos and documentation 3,3MB). But just for setting the line height of a ListView this is overbloated.
The other workaround suggested here (adding an ImageList) works only to increase the row height. But it does not allow to really set the RowHeight independent of the image height. Additionally the default row height depends on the operating system. For example on Windows 7 the rows are much higher than on XP. You cannot chose to make them tighter, only higher.
But with very few lines you can do what you want. Just copy and paste the following class:
After adding a ListViewEx to your Form you will see a new property in the Visual Studio Forms Designer which allows to set the row height in pixels:
The value you enter there will be the row height in pixels and it will be respected exatctly on all operating systems. I tested it on Windows XP, 7 and 10:
Additionally my class has two more advantages over the original ListView: It draws flicker-free and it respects the ForeColor and Font set in
ListViewSubItem
which is ignored by the original Microsoft ListView. So you can draw each cell with a different color and font.IMPORTANT: As the MSDN says
LBS_OWNERDRAWFIXED
has been designed only for Details view (Report view). My code works only for this mode and this is because Microsoft has designed it like that.Additionally please note that setting
ListView.OwnerDraw = true
is a completely different thing than usingLVS_OWNERDRAWFIXED
.I did not implement drawing icons, because I don't need that. But you can easily add this.
You have to use a bit of a hack. The trick is to use an image list in the StateImageList property. The ListView will adjust its item height, based on the height of the ImageList's ImageSize property. You do not have to specify an image for your items, but just using the StateImageList will force the ListView to adjust. In the example below, I had set the image list size to 32x32, thus resulting in a 32px height ListViewItem(s).
The default line height of a ListView (in report view mode) is computed based on the control's font size.
So to select the line height, choose a font with the right height in the ListView properties. For example, select MS Sans Serif 18.
Then you can change the font used by all items: when you insert a new item, set its font property.
To optimize font assignment you should declare the item font as a private member of the form:
Then when adding items :
This trick is the only easy one allowing to have SMALLER line height ;) i.E. set control's font size to 7 and set items' font size to 10. (Tested with VS 2008 )
It can be done using the
SmallImageList
trick -- you just have to be careful. ObjectListView -- an open source wrapper around a standard .NETListView
-- uses that trick to successfully implement aRowHeight
property.If you want 32 pixels for each row, allocate an
ImageList
that is 16x32 (width x height), and then position each of your images in the vertical middle of the 32-pixel height.This screen shot shows 32-pixel rows and the word wrapping that is possible because of the extra space:
ObjectListView
does all this work for you. In fact, if you are trying to do anything with a ListView, you should seriously looked at using anObjectListView
instead. It makes many difficult things (e.g. sorting by column type, custom tooltips) trivial, and several impossible things (e.g. overlays, groups on virtual lists) possible.For the people that are still struggling with this, here is the code I use:
To use this, just do:
Plasmabubble has the right idea. This expands on that and is what I use to use a narrow line-width for the items.
The linespacing in a ListView is dependent on the ListView's font and can't be changed. However, you can set the font for the items in the ListView to something larger than the ListView's font.
If you want it to be proportional, create a font based on the item's font. I want the item height to be 90% of normal, whatever the font chosen.
When I populate the list I used a font stored in settings but you could also use a literal font like "Consolas".