using System;
using System.Windows.Forms;
namespace ListViewExtensionMethods
{
public static class ListViewExtensions
{
public static void AutoSizeControlHeight ( this ListView lv, int maxItemsToShow, bool adjustForHorizontalScrollBar)
{
}
public static void AutoSizeControlWidth ( this ListView lv, bool adjustForVerticalScrollBar )
{
}
public static void AutoSizeControl ( this ListView lv, int maxItemsToShow, bool adjustForHorizontalScrollBar, bool adjustForVerticalScrollBar )
{
}
}
}
int positionBefore = 0;
int positionAfter = 0;
if (lv.Items.Count == 0)
return;
if (maxItemsToShow > lv.Items.Count)
maxItemsToShow = lv.Items.Count);
lv.Height = 1;
positionBefore = -1;
while (positionBefore != positionAfter && (lv.MaximumSize.Height == 0 || lv.Height < lv.MaximumSize.Height))
{
}
lv.Height += 1;
lv.Items[0].EnsureVisible();
positionBefore = lv.Items[maxItemsToShow - 1].Position.Y;
lv.Items[maxItemsToShow - 1].EnsureVisible();
positionAfter = lv.Items[maxItemsToShow - 1].Position.Y;
while (positionBefore != positionAfter && (lv.MaximumSize.Height == 0 || lv.Height < lv.MaximumSize.Height))
{
lv.Height += 1;
lv.Items[0].EnsureVisible();
positionBefore = lv.Items[maxItemsToShow - 1].Position.Y;
lv.Items[maxItemsToShow - 1].EnsureVisible();
positionAfter = lv.Items[maxItemsToShow - 1].Position.Y;
}
if (adjustForHorizontalScrollBar)
lv.Height += SystemInformation.HorizontalScrollBarHeight;
lv.Width = 0;
for (int i = 0; i < lv.Columns.Count; i++)
lv.Width += lv.Columns[i].Width;
if (adjustForVerticalScrollBar)
lv.Width += SystemInformation.VerticalScrollBarWidth;
using System;
using System.Windows.Forms;
namespace ListViewExtensionMethods
{
public static class ListViewExtensions
{
public static void AutoSizeControlHeight ( this ListView lv, int maxItemsToShow, bool adjustForHorizontalScrollBar )
{
int positionBefore = 0;
int positionAfter = 0;
if (lv.Items.Count == 0)
return;
if (maxItemsToShow > lv.Items.Count)
maxItemsToShow = lv.Items.Count;
lv.Height = 50;
while (positionBefore != positionAfter && (lv.MaximumSize.Height == 0 || lv.Height < lv.MaximumSize.Height))
{
lv.Height += 1;
lv.Items[0].EnsureVisible();
positionBefore = lv.Items[maxItemsToShow - 1].Position.Y;
lv.Items[maxItemsToShow - 1].EnsureVisible();
positionAfter = lv.Items[maxItemsToShow - 1].Position.Y;
}
if (adjustForHorizontalScrollBar)
lv.Height += SystemInformation.HorizontalScrollBarHeight;
}
public static void AutoSizeControlWidth ( this ListView lv, bool adjustForVerticalScrollBar)
{
lv.Width = 0;
for (int i = 0; i < lv.Columns.Count; i++)
lv.Width += lv.Columns[i].Width;
if (adjustForVerticalScrollBar)
lv.Width += SystemInformation.VerticalScrollBarWidth;
}
public static void AutoSizeControlColumnWidth ( this ListView lv, bool adjustForVerticalScrollBar)
{
int resizeByContent = 0;
int resizeByHeader = 0;
for (int i = 0; i < lv.Columns.Count; i++)
{
lv.Columns[i].AutoResize(ColumnHeaderAutoResizeStyle.ColumnContent);
resizeByContent = lv.Columns[i].Width;
lv.Columns[i].AutoResize(ColumnHeaderAutoResizeStyle.HeaderSize);
resizeByHeader = lv.Columns[i].Width;
lv.Columns[i].Width = (resizeByHeader > resizeByContent) ? resizeByHeader : resizeByContent;
}
}
public static void AutoSizeControl ( this ListView lv, int maxItemsToShow, bool adjustForHorizontalScrollBar, bool adjustForVerticalScrollBar )
{
lv.AutoSizeControlColumnWidth();
lv.AutoSizeControlWidth(adjustForVerticalScrollBar);
lv.AutoSizeControlHeight(maxItemsToShow,adjustForHorizontalScrollBar);
}
}
}
Have a question about something in this article? You can receive help directly from the article author. Sign up for a free trial to get started.
Comments (1)
Commented:
Open in new window
The only caveat is that the column header height is slightly taller than the other items. You might be able to determine this, but for now I just added a fixed offset of 6 pixels.