2011年8月2日 星期二

Sort ListView by any column

Referece:http://www.java2s.com/Code/CSharp/GUI-Windows-Form/SortaListViewbyAnyColumn.htm

using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
using System.Data;
using System.IO;

public class Form1 : System.Windows.Forms.Form
{
private System.Windows.Forms.ListView listView1;
private System.Windows.Forms.ColumnHeader lvcState;
private System.Windows.Forms.ColumnHeader lvcCapital;

public Form1()
{
InitializeComponent();
listView1.Items.Add (new ListViewItem (new string[]{"a","d"}));
listView1.Items.Add (new ListViewItem (new string[]{"b","c"}));
listView1.Items.Add (new ListViewItem (new string[]{"c","b"}));
listView1.Items.Add (new ListViewItem (new string[]{"d","a"}));

listView1.View = View.Details;
}
private void InitializeComponent()
{
this.listView1 = new System.Windows.Forms.ListView();
this.lvcState = new System.Windows.Forms.ColumnHeader();
this.lvcCapital = new System.Windows.Forms.ColumnHeader();
this.SuspendLayout();

this.listView1.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] {
this.lvcState,
this.lvcCapital});
this.listView1.FullRowSelect = true;
this.listView1.Location = new System.Drawing.Point(0, 32);
this.listView1.MultiSelect = false;
this.listView1.Name = "listView1";
this.listView1.Size = new System.Drawing.Size(292, 160);
this.listView1.Sorting = System.Windows.Forms.SortOrder.Descending;
this.listView1.TabIndex = 3;
this.listView1.ColumnClick += new System.Windows.Forms.ColumnClickEventHandler(this.listView1_OnColumnClick);
this.listView1.SelectedIndexChanged += new System.EventHandler(this.listView1_OnSelectedIndexChanged);
//
// lvcState
//
this.lvcState.Text = "State Name";
this.lvcState.Width = 120;
//
// lvcCapital
//
this.lvcCapital.Text = "Capital City";
this.lvcCapital.Width = 120;
//
// Form1
//
this.AutoScaleBaseSize = new System.Drawing.Size(5, 13);
this.ClientSize = new System.Drawing.Size(292, 273);
this.Controls.AddRange(new System.Windows.Forms.Control[] { this.listView1,
});
this.MinimumSize = new System.Drawing.Size(300, 300);
this.Name = "Form1";
this.Text = "The State Flags";
this.ResumeLayout(false);

}
static void Main()
{
Application.Run(new Form1());
}

private void listView1_OnColumnClick(object sender, System.Windows.Forms.ColumnClickEventArgs e)
{
ListViewSorter Sorter = new ListViewSorter();
listView1.ListViewItemSorter = Sorter;
if (!(listView1.ListViewItemSorter is ListViewSorter))
return;
Sorter = (ListViewSorter) listView1.ListViewItemSorter;

if (Sorter.LastSort == e.Column)
{
if (listView1.Sorting == SortOrder.Ascending)
listView1.Sorting = SortOrder.Descending;
else
listView1.Sorting = SortOrder.Ascending;
}
else{
listView1.Sorting = SortOrder.Descending;
}
Sorter.ByColumn = e.Column;

listView1.Sort ();
}

private void listView1_OnSelectedIndexChanged(object sender, System.EventArgs e)
{
if (listView1.SelectedItems.Count == 0)
{
return;
}
string State = listView1.SelectedItems[0].SubItems[0].Text;

string Capital = listView1.SelectedItems[0].SubItems[1].Text;
if (State.Length > 0)
{
Console.WriteLine(State + " " + Capital);
}
}
}

public class ListViewSorter : System.Collections.IComparer
{
public int Compare (object o1, object o2)
{
if (!(o1 is ListViewItem))
return (0);
if (!(o2 is ListViewItem))
return (0);

ListViewItem lvi1 = (ListViewItem) o2;
string str1 = lvi1.SubItems[ByColumn].Text;
ListViewItem lvi2 = (ListViewItem) o1;
string str2 = lvi2.SubItems[ByColumn].Text;

int result;
if (lvi1.ListView.Sorting == SortOrder.Ascending)
result = String.Compare (str1, str2);
else
result = String.Compare (str2, str1);

LastSort = ByColumn;

return (result);
}


public int ByColumn
{
get {return Column;}
set {Column = value;}
}
int Column = 0;

public int LastSort
{
get {return LastColumn;}
set {LastColumn = value;}
}
int LastColumn = 0;
}

沒有留言: