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

转自:http://www.csharpwin.com/csharpspace/9226r108.shtml

Net 2.0中,ListView中虽然增加了AutoResizeColumns函数,允许自动对列宽进行调整,但是对于其中的

AutoResizeColumns(ColumnHeaderAutoResizeStyle.ColumnContent)  

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;   

    }   

}  

        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);  
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;   

    }   

}  

    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中。

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

view plaincopy to clipboardprint?

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();//对列表进行自定义排序   

}  

        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中点击列时的排序功能了~。

作者:hinyunsin

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值