抛砖引玉——实现LISTVIEW点击COLUMN排序的代码,可实现按时间,字符,数字
点击次数:23 次 发布日期:2008-11-27 01:37:17 作者:源代码网
|
using System.ComponentModel; using System.Collections; using System.Diagnostics; using System.Windows.Forms; using System.Drawing; namespace ListViewControl { /// <summary> /// Summary description for UserControl1. /// </summary> public class EastSpider : System.Windows.Forms.ListView { /// <summary> /// Required designer variable. /// </summary> /// private Comparer myComparer; private ArrayList colTypes = new ArrayList(); private System.ComponentModel.Container components = null; /// <summary> /// Sort Interface /// </summary> public class Comparer : IComparer { private int column; private int sign; private EastSpider.ColumnTypeEnum colType; public Comparer() { column = 0; sign = 1; colType = EastSpider.ColumnTypeEnum.ColumnTypeText; } public int Column { set { column = value; } get { return column; } } public int Sign { set { sign = value; } get { return sign; } } public ColumnTypeEnum ColType { set { colType = value; } get { return colType; } } public int Compare(object o1,object o2) { ListViewItem li1 = (ListViewItem)o1; ListViewItem li2 = (ListViewItem)o2; string s1,s2; try { if (column == 0) { s1 = li1.Text; s2 = li2.Text; //return sign * String.Compare(s1,s2); } else { s1 = li1.SubItems[column].Text; s2 = li2.SubItems[column].Text; } if (s1.Length == 0) { if (s2.Length > 0) { return (-sign); } else { return 0; } } else if (s2.Length == 0) { return sign; } switch (colType) { case ColumnTypeEnum.ColumnTypeNumber: long d1 = long.Parse(s1); long d2 = long.Parse(s2); if (d1 < d2) { return (-sign); } else if (d1 > d2) { return sign; } else { return 0; } case ColumnTypeEnum.ColumnTypeDate: DateTime t1 = DateTime.Parse(s1); DateTime t2 = DateTime.Parse(s2); return sign*DateTime.Compare(t1,t2); default: return sign * String.Compare(s1,s2); } } catch { return (0); } } } /// <summary> /// 排序类型 /// </summary> [Category("SortType"),Description("The Sort Type of Column you wanted do")] public enum ColumnTypeEnum { ColumnTypeText = 0, ColumnTypeDate = 1, ColumnTypeNumber = 2 } /// <summary> /// Clear All Items And Columns /// </summary> private void ClearAll() { Clear(); ClearColumns(); } /// <summary> /// Clear All Item /// </summary> private new void Clear() { base.Items.Clear(); } /// <summary> /// Clear All Columns And ColType /// </summary> private void ClearColumns() { base.Columns.Clear(); colTypes.Clear(); } public void AddColumn(string caption,ColumnTypeEnum columnType,HorizontalAlignment ha,int width) { ColumnHeader ch = new ColumnHeader(); ch.Text = caption; ch.TextAlign = ha; ch.Width = width; base.Columns.Add(ch); colTypes.Add(columnType); } /// <summary> /// Add Items /// </summary> /// <param name="item"></param> /// <param name="bgcolor"></param> /// <returns></returns> public int AddRow(ListViewItem item,Color bgcolor) { //ListViewItem li = new ListViewItem(args); item.UseItemStyleForSubItems = true; item.BackColor = bgcolor; Items.Add(item); return item.Index; } /// <summary> /// 点击事件 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> protected void ev_ColumnClick(object sender,System.Windows.Forms.ColumnClickEventArgs e) { //MessageBox.Show(e.Column.ToString()); myComparer.Column = e.Column; myComparer.Sign = (base.Sorting == SortOrder.Ascending)? -1:1; myComparer.ColType = (ColumnTypeEnum)colTypes[e.Column]; base.BeginUpdate(); switch (base.Sorting) { case SortOrder.Ascending: base.Sorting = SortOrder.Descending; break; case SortOrder.Descending: base.Sorting = SortOrder.Ascending; break; } base.EndUpdate(); } /// <summary> /// Override onclick /// </summary> /// <param name="e"></param> protected override void OnClick( System.EventArgs e) { base.OnClick(e); } /// <summary> /// Override OnMouseDown /// </summary> /// <param name="e"></param> protected override void OnMouseDown( System.Windows.Forms.MouseEventArgs e) { OnClick(e); } /// <summary> /// InitializeComponent /// </summary> public EastSpider() { // This call is required by the Windows.Forms Form Designer. base.ColumnClick += new System.Windows.Forms.ColumnClickEventHandler(this.ev_ColumnClick); myComparer = new Comparer(); base.ListViewItemSorter = (IComparer)myComparer; //InitializeComponent(); // TODO: Add any initialization after the InitForm call } /// <summary> /// Clean up any resources being used. /// </summary> protected override void Dispose( bool disposing ) { if( disposing ) { //if (components != null) //{ // components.Dispose(); / 源代码网供稿. |
