fork download
  1. using System;
  2. using System.Windows.Forms;
  3. using System.Collections;
  4.  
  5. namespace WindowsFormsApplication1
  6. {
  7. public partial class Form1 : Form
  8. {
  9. public Form1()
  10. {
  11. InitializeComponent();
  12. }
  13.  
  14. //ListViewItemSorterに指定するフィールド
  15. ListViewItemComparer listViewItemSorter;
  16.  
  17. private void Form1_Load(object sender, EventArgs e)
  18. {
  19. listView1.Dock = DockStyle.Fill;
  20. listView1.View = View.Details;
  21.  
  22. ColumnHeader ch1 = new ColumnHeader();
  23. ColumnHeader ch2 = new ColumnHeader();
  24. ch1.Text = "名前";
  25. ch2.Text = "ファイルの種類";
  26. listView1.Columns.Add(ch1);
  27. listView1.Columns.Add(ch2);
  28.  
  29. listView1.ColumnClick += new ColumnClickEventHandler(ListView1_ColumnClick);
  30.  
  31. ListViewItem lvi;
  32. // フォルダをリストに追加
  33. // フォルダの場合はタグにtrueを付ける
  34. lvi = new ListViewItem(new string[]{"ccc", "フォルダ"});
  35. lvi.Tag = true;
  36. listView1.Items.Add(lvi);
  37. lvi = new ListViewItem(new string[]{"aaa", "フォルダ"});
  38. lvi.Tag = true;
  39. listView1.Items.Add(lvi);
  40. lvi = new ListViewItem(new string[]{"bbb", "フォルダ"});
  41. lvi.Tag = true;
  42. listView1.Items.Add(lvi);
  43. // ファイルをリストに追加
  44. // ファイルの場合はタグにfalseを付ける
  45. lvi = new ListViewItem(new string[]{"a.txt", "テキストファイル"});
  46. lvi.Tag = false;
  47. listView1.Items.Add(lvi);
  48. lvi = new ListViewItem(new string[]{"c.txt", "テキストファイル"});
  49. lvi.Tag = false;
  50. listView1.Items.Add(lvi);
  51. lvi = new ListViewItem(new string[]{"b.txt", "テキストファイル"});
  52. lvi.Tag = false;
  53. listView1.Items.Add(lvi);
  54. //ListViewItemComparerの作成と設定
  55. listViewItemSorter = new ListViewItemComparer();
  56. listViewItemSorter.ColumnModes = new ListViewItemComparer.ComparerMode[]
  57. {
  58. ListViewItemComparer.ComparerMode.String,
  59. ListViewItemComparer.ComparerMode.String
  60. };
  61. //ListViewItemSorterを指定する
  62. listView1.ListViewItemSorter = listViewItemSorter;
  63. listView1.AutoResizeColumns(ColumnHeaderAutoResizeStyle.HeaderSize);
  64. }
  65.  
  66. //列がクリックされた時
  67. private void ListView1_ColumnClick(object sender, ColumnClickEventArgs e)
  68. {
  69. //クリックされた列を設定
  70. listViewItemSorter.Column = e.Column;
  71. //並び替える
  72. listView1.Sort();
  73. }
  74. }
  75.  
  76.  
  77. // ListViewItemComparerクラスは以下のページから引用しました
  78. // http://d...content-available-to-author-only...n.net/vb/dotnet/control/lvitemsort.html
  79.  
  80. /// <summary>
  81. /// ListViewの項目の並び替えに使用するクラス
  82. /// </summary>
  83. public class ListViewItemComparer : IComparer
  84. {
  85. /// <summary>
  86. /// 比較する方法
  87. /// </summary>
  88. public enum ComparerMode
  89. {
  90. String,
  91. Integer,
  92. DateTime
  93. };
  94.  
  95. private int _column;
  96. private SortOrder _order;
  97. private ComparerMode _mode;
  98. private ComparerMode[] _columnModes;
  99.  
  100. /// <summary>
  101. /// 並び替えるListView列の番号
  102. /// </summary>
  103. public int Column
  104. {
  105. set
  106. {
  107. if (_column == value)
  108. {
  109. if (_order == SortOrder.Ascending)
  110. _order = SortOrder.Descending;
  111. else if (_order == SortOrder.Descending)
  112. _order = SortOrder.Ascending;
  113. }
  114. _column = value;
  115. }
  116. get
  117. {
  118. return _column;
  119. }
  120. }
  121. /// <summary>
  122. /// 昇順か降順か
  123. /// </summary>
  124. public SortOrder Order
  125. {
  126. set
  127. {
  128. _order = value;
  129. }
  130. get
  131. {
  132. return _order;
  133. }
  134. }
  135. /// <summary>
  136. /// 並び替えの方法
  137. /// </summary>
  138. public ComparerMode Mode
  139. {
  140. set
  141. {
  142. _mode = value;
  143. }
  144. get
  145. {
  146. return _mode;
  147. }
  148. }
  149. /// <summary>
  150. /// 列ごとの並び替えの方法
  151. /// </summary>
  152. public ComparerMode[] ColumnModes
  153. {
  154. set
  155. {
  156. _columnModes = value;
  157. }
  158. }
  159.  
  160. /// <summary>
  161. /// ListViewItemComparerクラスのコンストラクタ
  162. /// </summary>
  163. /// <param name="col">並び替える列番号</param>
  164. /// <param name="ord">昇順か降順か</param>
  165. /// <param name="cmod">並び替えの方法</param>
  166. public ListViewItemComparer(
  167. int col, SortOrder ord, ComparerMode cmod)
  168. {
  169. _column = col;
  170. _order = ord;
  171. _mode = cmod;
  172. }
  173. public ListViewItemComparer()
  174. {
  175. _column = 0;
  176. _order = SortOrder.Ascending;
  177. _mode = ComparerMode.String;
  178. }
  179.  
  180. //xがyより小さいときはマイナスの数、大きいときはプラスの数、
  181. //同じときは0を返す
  182. public int Compare(object x, object y)
  183. {
  184. int result = 0;
  185. //ListViewItemの取得
  186. ListViewItem itemx = (ListViewItem)x;
  187. ListViewItem itemy = (ListViewItem)y;
  188.  
  189. //並べ替えの方法を決定
  190. if (_columnModes != null && _columnModes.Length > _column)
  191. _mode = _columnModes[_column];
  192.  
  193. //並び替えの方法別に、xとyを比較する
  194. switch (_mode)
  195. {
  196. case ComparerMode.String:
  197.  
  198. if (_column == 0) // 名前のヘッダーをクリックしたときの処理
  199. {
  200. // タグの値が同じならフォルダとファイルの比較ではない
  201. if (itemx.Tag == itemy.Tag)
  202. {
  203. result = string.Compare(itemx.SubItems[_column].Text, itemy.SubItems[_column].Text);
  204. }
  205. else
  206. {
  207. // フォルダとファイルを比較しているので-1を返す
  208. result = -1;
  209. }
  210. }
  211. else // ファイルの種類をクリックしたときの処理
  212. {
  213. result = string.Compare(itemx.SubItems[_column].Text, itemy.SubItems[_column].Text);
  214. }
  215. break;
  216. case ComparerMode.Integer:
  217. result = int.Parse(itemx.SubItems[_column].Text) -
  218. int.Parse(itemy.SubItems[_column].Text);
  219. break;
  220. case ComparerMode.DateTime:
  221. result = DateTime.Compare(
  222. DateTime.Parse(itemx.SubItems[_column].Text),
  223. DateTime.Parse(itemy.SubItems[_column].Text));
  224. break;
  225. }
  226.  
  227. //降順の時は結果を+-逆にする
  228. if (_order == SortOrder.Descending)
  229. result = -result;
  230. else if (_order == SortOrder.None)
  231. result = 0;
  232.  
  233. //結果を返す
  234. return result;
  235. }
  236. }
  237. }
  238.  
Not running #stdin #stdout 0s 0KB
stdin
Standard input is empty
stdout
Standard output is empty