listview winfrom 表头_winform ListView点击行表头,排序

本文介绍了两种在Winform中实现ListView点击表头进行数据排序的方法。第一种方法是通过DataView和DataTable,设置DataView的Sort属性来排序。第二种方法是自定义IComparer比较器并绑定到ListView,提供了更高的灵活性。代码示例详细展示了这两种实现方式。
摘要由CSDN通过智能技术生成

第一种办法:

将ListView的数据放入DataView中,设置DataView的Sort属性,然后将DataView中的内容在ListView中展示出来。

(1)初始化ListView,将ListView的数据存入DataTable中

(2)从DataTable中获得DataView

(3)设置DataView的Sort属性,根据条件进行设定

(4)将DataView中的数据在ListView中展示出来

aaa.txt:

1 usingSystem;2 usingSystem.Data;3 usingSystem.IO;4 usingSystem.Text;5 usingSystem.Windows.Forms;6

7 namespacebatch8 {9 public partial classForm3 : Form10 {11 publicForm3()12 {13 InitializeComponent();14 }15 DataTable dt = null;16 private void Form3_Load(objectsender, EventArgs e)17 {18 //添加DataTable的列表头

19 dt = newDataTable();20 dt.Columns.Add("num");21 dt.Columns.Add("name");22 dt.Columns.Add("age");23 string path = @"C:\Users\Administrator\Desktop\aaa.txt";24 //读取文本文件内容

25 string[] ss =File.ReadAllLines(path, Encoding.Default);26 foreach (string s inss)27 {28 string[] a = s.Split(new char[] { ' '}, StringSplitOptions.RemoveEmptyEntries);29 //往listView1中添加数据

30 ListViewItem li = newListViewItem();31 li.Text = a[0];32 li.SubItems.AddRange(new string[] { a[1], a[2] });33 listView1.Items.Add(li);34 //往DataTable中添加行数据

35 dt.Rows.Add(a[0], a[1], a[2]);36 }37 }38 int sortfield = -1;39 ///

40 ///listView1的列头点击事件41 ///

42 ///

43 ///

44 private void listView1_ColumnClick(objectsender, ColumnClickEventArgs e)45 {46 if (dt == null) return;47 //获得有内容的DataView

48 DataView dv = newDataView(dt);49 //获得所点列的索引

50 int sf =e.Column;51 if (sortfield ==sf)52 {53 //设置sort

54 dv.Sort = dt.Columns[sf].ColumnName + "desc";55 sortfield = -1;56 }57 else

58 {59 dv.Sort = dt.Columns[sf].ColumnName + "asc";60 sortfield =sf;61 }62 //展示DataView中的内容

63 listView1.Items.Clear();64 foreach (DataRowView drv indv)65 {66 ListViewItem li = newListViewItem();67 li.Text = drv[0].ToString();68 li.SubItems.Add(drv[1].ToString());69 li.SubItems.Add(drv[2].ToString());70 listView1.Items.Add(li);71 }72

73 }74 }75 }

View Code

重写一个排序方法,进行方法绑定,可以具体问题具体分析,灵活性大。

1 classListViewColumnSorter : IComparer2 {3 private intcolumnToSort;4 privateSortOrder orderOfSort;5 privateCaseInsensitiveComparer objectCompare;6 publicListViewColumnSorter()7 {8 columnToSort = 0;9 orderOfSort =SortOrder.None;10 objectCompare = newCaseInsensitiveComparer();11 }12

13

14 int IComparer.Compare(object x, objecty)15 {16 int result = 0;17 ListViewItem lx =(ListViewItem)x;18 ListViewItem ly =(ListViewItem)y;19 string xtext =lx.SubItems[columnToSort].Text;20 string ytext =ly.SubItems[columnToSort].Text;21 int xx = 0, yy = 0;22 if (int.TryParse(xtext, out xx) && int.TryParse(ytext, outyy))23 result =xx.CompareTo(yy);24 else

25 result =xtext.CompareTo(ytext);26 if (orderOfSort ==SortOrder.Ascending)27 returnresult;28 else if (orderOfSort ==SortOrder.Descending)29 return -result;30 else

31 return 0;32 }33 public intsortColumn34 {35 set { columnToSort =value; }36 get { returncolumnToSort; }37 }38 publicSortOrder order39 {40 set { orderOfSort =value; }41 get { returnorderOfSort; }42 }43

44

45

46 }47

48 classListViewHelper49 {50 publicListViewHelper() { }51 public static void listView_columnClick(objectsender, ColumnClickEventArgs e)52 {53

54 ListView lv = sender asListView;55 lv.Cursor =Cursors.Hand;56 if (e.Column == ((ListViewColumnSorter)lv.ListViewItemSorter).sortColumn)//排序方式

57 {58 if (((ListViewColumnSorter)lv.ListViewItemSorter).order ==SortOrder.Ascending)59 ((ListViewColumnSorter)lv.ListViewItemSorter).order =SortOrder.Descending;60 else

61 ((ListViewColumnSorter)lv.ListViewItemSorter).order =SortOrder.Ascending;62

63 }64 else

65 {66 ((ListViewColumnSorter)lv.ListViewItemSorter).sortColumn =e.Column;67 ((ListViewColumnSorter)lv.ListViewItemSorter).order =SortOrder.Ascending;68 }69 lv.Sort();70 }71 }

View Code

以上代码封装后无须更改,在窗体中添加一个ListView控件,在窗体的Load事件中添加如下代码:

private void Form1_Load(object sender, EventArgs e)

{

this.listView1.ListViewItemSorter = new Common.ListViewColumnSorter();

this.listView1.ColumnClick += new ColumnClickEventHandler(Common.ListViewHelper.ListView_ColumnClick);

}

完!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值