您的位置:首页 > 其它

为ListView添加自动列宽调整和点击列表头自动排序功能

2009-04-29 15:04 399 查看
.Net 2.0中,ListView中虽然增加了AutoResizeColumns函数,允许自动对列宽进行调整,但是对于其中的

AutoResizeColumns(ColumnHeaderAutoResizeStyle.ColumnContent)


也就是根据内容自动调整大小的效果却差强人意,因此决定自己动手写一个函数对其允许根据列的内容动态调整大小。下面就是动态调整列宽的函数源码:

private void AutoResizeColumnWidth(ListView lv)
{
int count = lv.Columns.Count;
int MaxWidth = 0;
Graphics graphics=lv.CreateGraphics();
Font font = lv.Font;
ListView.ListViewItemCollection items = lv.Items;

string str;
int width;

lv.AutoResizeColumns(ColumnHeaderAutoResizeStyle.HeaderSize);

for (int i = 0; i < count; i++)
{
str = lv.Columns[i].Text;
MaxWidth = lv.Columns[i].Width;

foreach (ListViewItem item in items)
{
str = item.SubItems[i].Text;
width = (int)graphics.MeasureString(str, font).Width;
if (width > MaxWidth)
{
MaxWidth = width;
}
}
if (i == 0)
{
lv.Columns[i].Width = lv.SmallImageList.ImageSize.Width + MaxWidth;
}
lv.Columns[i].Width = MaxWidth;
}
}


这里先使用了函数

lv.AutoResizeColumns(ColumnHeaderAutoResizeStyle.HeaderSize);


目的在于先根据列表头调整大小,初始化MaxWidth为列表头的宽度。

这样就完成了列宽的自动调整。

下面介绍一下列的排序功能。

要对列进行排序,首先要简历自己的排序函数,如下:

class MyListViewSort : System.Collections.IComparer
{
private int col;
private bool descK;
public MyListViewSort()
{
col = 0;
}
public MyListViewSort(int column, object Desc)
{
descK = (bool)Desc;
col = column; //当前列,0,1,2...,参数由ListView控件的ColumnClick事件传递
}
public int Compare(object x, object y)
{
int tempInt = String.Compare(((ListViewItem)x).SubItems[col].Text, ((ListViewItem)y).SubItems[col].Text);
if (descK) return -tempInt;
else return tempInt;
}
}


其中descK用于描述排列顺序是顺序还是逆序。这是个bool值,绑定在该列的Tag中。

下面就是点击列标头时的事件处理:

private void listView_ColumnClick(object sender, ColumnClickEventArgs e)
{
ListView lv = (ListView)sender;
if (lv.Columns[e.Column].Tag == null)
lv.Columns[e.Column].Tag = true;
bool tabK = (bool)lv.Columns[e.Column].Tag;
if (tabK)
lv.Columns[e.Column].Tag = false;
else
lv.Columns[e.Column].Tag = true;
lv.ListViewItemSorter = new MyListViewSort(e.Column, lv.Columns[e.Column].Tag);
//指定排序器并传送列索引与升序降序关键字
lv.Sort();//对列表进行自定义排序
}


这样,就简单的完成了对ListView中点击列时的排序功能了~
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: