在开发WinForm Project 时,会用经常用到这个控件,昨天研究了一下,总结如下:
IDE:VS2005
①创建一个Windows Application,Project Name is 【TestListView】在WinForm上drag一个ListView.
②创建一个class.
![](https://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
using System.Collections;
using System.Windows.Forms;
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
/**//// <summary>
/// 继承自IComparer
/// </summary>
public class ListViewColumnSorter : IComparer
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
{
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
/**//// <summary>
/// 指定按照哪个列排序
/// </summary>
private int ColumnToSort;
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
/**//// <summary>
/// 指定排序的方式
/// </summary>
private SortOrder OrderOfSort;
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
/**//// <summary>
/// 声明CaseInsensitiveComparer类对象,
/// 参见ms-help://MS.VSCC.2003/MS.MSDNQTR.2003FEB.2052/cpref/html/frlrfSystemCollectionsCaseInsensitiveComparerClassTopic.htm
/// </summary>
private CaseInsensitiveComparer ObjectCompare;
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
/**//// <summary>
/// 构造函数
/// </summary>
public ListViewColumnSorter()
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
// 默认按第一列排序
ColumnToSort = 0;
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
// 排序方式为不排序
OrderOfSort = SortOrder.None;
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
// 初始化CaseInsensitiveComparer类对象
ObjectCompare = new CaseInsensitiveComparer();
}
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
/**//// <summary>
/// 重写IComparer接口.
/// </summary>
/// <param name="x">要比较的第一个对象</param>
/// <param name="y">要比较的第二个对象</param>
/// <returns>比较的结果.如果相等返回0,如果x大于y返回1,如果x小于y返回-1</returns>
public int Compare(object x, object y)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
int compareResult;
ListViewItem listviewX, listviewY;
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
// 将比较对象转换为ListViewItem对象
listviewX = (ListViewItem)x;
listviewY = (ListViewItem)y;
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
// 比较
compareResult = ObjectCompare.Compare(listviewX.SubItems[ColumnToSort].Text, listviewY.SubItems[ColumnToSort].Text);
// 根据上面的比较结果返回正确的比较结果
if (OrderOfSort == SortOrder.Ascending)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
// 因为是正序排序,所以直接返回结果
return compareResult;
}
else if (OrderOfSort == SortOrder.Descending)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
// 如果是反序排序,所以要取负值再返回
return (-compareResult);
}
else
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
// 如果相等返回0
return 0;
}
}
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
/**//// <summary>
/// 获取或设置按照哪一列排序.
/// </summary>
public int SortColumn
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
set
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
ColumnToSort = value;
}
get
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
return ColumnToSort;
}
}
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
/**//// <summary>
/// 获取或设置排序方式.
/// </summary>
public SortOrder Order
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
set
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
OrderOfSort = value;
}
get
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
return OrderOfSort;
}
}
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
}
③Form1的Code如下:
![](https://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
namespace TestListView
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif)
{
public partial class Form1 : Form
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
private ListViewColumnSorter lvwColumnSorter;
public Form1()
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
InitializeComponent();
// 创建一个ListView排序类的对象,并设置listView1的排序器
lvwColumnSorter = new ListViewColumnSorter();
this.listView1.ListViewItemSorter = lvwColumnSorter;
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif)
非排序#region 非排序
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
//手动添加item_方法一
//this.listView1.ListViewItemSorter
//ListViewItem lvi = new ListViewItem("AX");
//lvi.SubItems.Add("1");
//lvi.SubItems.Add("2");
//lvi.Checked=true;
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
//手动添加item_方法二
ListViewItem lvi ;
for (int i = 0; i < 3; i++)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
lvi = new ListViewItem(new string[]
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
"AXzhz",Convert.ToString((i+1)*2),Convert.ToString((i+1)*3)
});
this.listView1.Items.Add(lvi);
}
//让ListView获得焦点,以使用上下箭头选择item
this.listView1.Focus();
//Code创建ListView,感觉没必要,drag控件多爽.
CreateMyListView();
#endregion
}
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
private void CreateMyListView()
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
// 创建一个ListView并设置其位置大小形状.
ListView listView1 = new ListView();
listView1.Bounds = new Rectangle(new Point(10, 10), new Size(300, 200));
// 设置该属性View视图
listView1.View = View.Details;
// 允许用户修改listView中项的内容.
listView1.LabelEdit = true;
// 允许用户自行调整项之间的边距.
listView1.AllowColumnReorder = true;
// 每个Item前端显示checkbox.
listView1.CheckBoxes = true;
// 选中全行.
listView1.FullRowSelect = true;
// 表格设置
listView1.GridLines = true;
//排序
listView1.Sorting = SortOrder.Ascending;
// 创建三个ListViewItem和九个子item
ListViewItem item1 = new ListViewItem("item1", 0);
// 设置item的check.
item1.SubItems.Add("1");
item1.SubItems.Add("2");
item1.Checked = true;
item1.SubItems.Add("3");
ListViewItem item2 = new ListViewItem("item2", 1);
item2.SubItems.Add("4");
item2.SubItems.Add("5");
item2.SubItems.Add("6");
ListViewItem item3 = new ListViewItem("item3", 0);
item3.Checked = true;
item3.SubItems.Add("7");
item3.SubItems.Add("8");
item3.SubItems.Add("9");
// 创建listView控件的列.
listView1.Columns.Add("Item Column", -2, HorizontalAlignment.Left);
listView1.Columns.Add("Column 2", -2, HorizontalAlignment.Left);
listView1.Columns.Add("Column 3", -2, HorizontalAlignment.Left);
listView1.Columns.Add("Column 4", -2, HorizontalAlignment.Center);
//把创建的项和子项加入listView
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
listView1.Items.AddRange(new ListViewItem[]
{ item1, item2, item3 });
// 添加ListView进入controls集合
this.Controls.Add(listView1);
}
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
private void listView1_ColumnClick(object sender, ColumnClickEventArgs e)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
// 检查点击的列是不是现在的排序列.
if (e.Column == lvwColumnSorter.SortColumn)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
// 重新设置此列的排序方法.
if (lvwColumnSorter.Order == SortOrder.Ascending)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
lvwColumnSorter.Order = SortOrder.Descending;
}
else
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
lvwColumnSorter.Order = SortOrder.Ascending;
}
}
else
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
// 设置排序列,默认为正向排序
lvwColumnSorter.SortColumn = e.Column;
lvwColumnSorter.Order = SortOrder.Ascending;
}
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
// 用新的排序方法对ListView排序
//this.listFiles.Sort();
this.listView1.Sort();
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
}
}
}
【注】本帖严重参考了㊣点滴伊飏 的排序功能,只是方便大家Copy Code.
而且令人惊奇的是我竟然在我的项目中发现了这个排序方法的英文注释版.....
原文:http://www.cnblogs.com/iyond/services/trackbacks/261161.aspx
【问题一】对排序功能:知其然,不知其所以然.
this.listView1.Sort(); 后
为什么一执行这句话,就会调用ListViewColumnSorter 的Compare()方法,而且重复执行该方法,对排序列进行冒泡排序
我反编译的Sort()方法,看着发晕,跟踪了下Sort()里用的属性,也没有用到ListViewItemSorter 属性啊:
public void Sort()
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif)
{
if (this.VirtualMode)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
throw new InvalidOperationException(SR.GetString("ListViewSortNotAllowedInVirtualListView"));
}
this.ApplyUpdateCachedItems();
if (base.IsHandleCreated && (this.listItemSorter != null))
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
NativeMethods.ListViewCompareCallback pfnCompare = new NativeMethods.ListViewCompareCallback(this.CompareFunc);
UnsafeNativeMethods.SendMessage(new HandleRef(this, base.Handle), 0x1030, IntPtr.Zero, pfnCompare);
}
}
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
能帮忙解释下具体的执行过程吗?为什么要实现这个接口?怎么用到这个接口的实现类?.......
【问题二】一般把CheckBoxes设置为True,CheckBox就会出现在item的最前面.我要实现CheckBox在item的中间怎么实现,虽然有源码,但我研究了半天也没研究出来.
实现图如下.
博客园→
斧头帮少帮主