using System; using System.Windows.Forms; using System.Collections; namespace WindowsFormsApplication1 { public partial class Form1 : Form { public Form1() { InitializeComponent(); } //ListViewItemSorterに指定するフィールド ListViewItemComparer listViewItemSorter; private void Form1_Load(object sender, EventArgs e) { listView1.Dock = DockStyle.Fill; listView1.View = View.Details; ColumnHeader ch1 = new ColumnHeader(); ColumnHeader ch2 = new ColumnHeader(); ch1.Text = "名前"; ch2.Text = "ファイルの種類"; listView1.Columns.Add(ch1); listView1.Columns.Add(ch2); listView1.ColumnClick += new ColumnClickEventHandler(ListView1_ColumnClick); ListViewItem lvi; // フォルダをリストに追加 // フォルダの場合はタグにtrueを付ける lvi = new ListViewItem(new string[]{"ccc", "フォルダ"}); lvi.Tag = true; listView1.Items.Add(lvi); lvi = new ListViewItem(new string[]{"aaa", "フォルダ"}); lvi.Tag = true; listView1.Items.Add(lvi); lvi = new ListViewItem(new string[]{"bbb", "フォルダ"}); lvi.Tag = true; listView1.Items.Add(lvi); // ファイルをリストに追加 // ファイルの場合はタグにfalseを付ける lvi = new ListViewItem(new string[]{"a.txt", "テキストファイル"}); lvi.Tag = false; listView1.Items.Add(lvi); lvi = new ListViewItem(new string[]{"c.txt", "テキストファイル"}); lvi.Tag = false; listView1.Items.Add(lvi); lvi = new ListViewItem(new string[]{"b.txt", "テキストファイル"}); lvi.Tag = false; listView1.Items.Add(lvi); //ListViewItemComparerの作成と設定 listViewItemSorter = new ListViewItemComparer(); listViewItemSorter.ColumnModes = new ListViewItemComparer.ComparerMode[] { ListViewItemComparer.ComparerMode.String, ListViewItemComparer.ComparerMode.String }; //ListViewItemSorterを指定する listView1.ListViewItemSorter = listViewItemSorter; listView1.AutoResizeColumns(ColumnHeaderAutoResizeStyle.HeaderSize); } //列がクリックされた時 private void ListView1_ColumnClick(object sender, ColumnClickEventArgs e) { //クリックされた列を設定 listViewItemSorter.Column = e.Column; //並び替える listView1.Sort(); } } // ListViewItemComparerクラスは以下のページから引用しました // http://d...content-available-to-author-only...n.net/vb/dotnet/control/lvitemsort.html /// /// ListViewの項目の並び替えに使用するクラス /// public class ListViewItemComparer : IComparer { /// /// 比較する方法 /// public enum ComparerMode { String, Integer, DateTime }; private int _column; private SortOrder _order; private ComparerMode _mode; private ComparerMode[] _columnModes; /// /// 並び替えるListView列の番号 /// public int Column { set { if (_column == value) { if (_order == SortOrder.Ascending) _order = SortOrder.Descending; else if (_order == SortOrder.Descending) _order = SortOrder.Ascending; } _column = value; } get { return _column; } } /// /// 昇順か降順か /// public SortOrder Order { set { _order = value; } get { return _order; } } /// /// 並び替えの方法 /// public ComparerMode Mode { set { _mode = value; } get { return _mode; } } /// /// 列ごとの並び替えの方法 /// public ComparerMode[] ColumnModes { set { _columnModes = value; } } /// /// ListViewItemComparerクラスのコンストラクタ /// /// 並び替える列番号 /// 昇順か降順か /// 並び替えの方法 public ListViewItemComparer( int col, SortOrder ord, ComparerMode cmod) { _column = col; _order = ord; _mode = cmod; } public ListViewItemComparer() { _column = 0; _order = SortOrder.Ascending; _mode = ComparerMode.String; } //xがyより小さいときはマイナスの数、大きいときはプラスの数、 //同じときは0を返す public int Compare(object x, object y) { int result = 0; //ListViewItemの取得 ListViewItem itemx = (ListViewItem)x; ListViewItem itemy = (ListViewItem)y; //並べ替えの方法を決定 if (_columnModes != null && _columnModes.Length > _column) _mode = _columnModes[_column]; //並び替えの方法別に、xとyを比較する switch (_mode) { case ComparerMode.String: if (_column == 0) // 名前のヘッダーをクリックしたときの処理 { // タグの値が同じならフォルダとファイルの比較ではない if (itemx.Tag == itemy.Tag) { result = string.Compare(itemx.SubItems[_column].Text, itemy.SubItems[_column].Text); } else { // フォルダとファイルを比較しているので-1を返す result = -1; } } else // ファイルの種類をクリックしたときの処理 { result = string.Compare(itemx.SubItems[_column].Text, itemy.SubItems[_column].Text); } break; case ComparerMode.Integer: result = int.Parse(itemx.SubItems[_column].Text) - int.Parse(itemy.SubItems[_column].Text); break; case ComparerMode.DateTime: result = DateTime.Compare( DateTime.Parse(itemx.SubItems[_column].Text), DateTime.Parse(itemy.SubItems[_column].Text)); break; } //降順の時は結果を+-逆にする if (_order == SortOrder.Descending) result = -result; else if (_order == SortOrder.None) result = 0; //結果を返す return result; } } }