2015. 4. 30. 15:53
C# with ListView
프로그램 설명
ListView 은 sorting 기능을 items 에서 지원하므로, 수작업으로 sub-items 까지 sorting 하는 기능을 작성해야 합니다. 그래서 필수적인 IComparer 인터페이스를 이용해서 구현합니다.
예제에 있는 sorting 타입은 3가지 타입으로 숫자, 날짜, 문자열로 나뉘어 구분합니다.
실행 후
프로그램 작성 순서
1. IComparer 에서 상속받은 ListViewComparer class
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Windows.Forms; namespace SortListViewColumn.lib { // Compares two ListView items based on a selected column. public class ListViewComparer : System.Collections.IComparer { private int ColumnNumber; private SortOrder SortOrder; public ListViewComparer(int column_number, SortOrder sort_order) { ColumnNumber = column_number; SortOrder = sort_order; } // Compare two ListViewItems. public int Compare(object object_x, object object_y) { // Get the objects as ListViewItems. ListViewItem item_x = object_x as ListViewItem; ListViewItem item_y = object_y as ListViewItem; // Get the corresponding sub-item values. string string_x; if (item_x.SubItems.Count <= ColumnNumber) { string_x = ""; } else { string_x = item_x.SubItems[ColumnNumber].Text; } string string_y; if (item_y.SubItems.Count <= ColumnNumber) { string_y = ""; } else { string_y = item_y.SubItems[ColumnNumber].Text; } // Compare them. int result; double double_x, double_y; if (double.TryParse(string_x, out double_x) && double.TryParse(string_y, out double_y)) { // Treat as a number. result = double_x.CompareTo(double_y); } else { DateTime date_x, date_y; if (DateTime.TryParse(string_x, out date_x) && DateTime.TryParse(string_y, out date_y)) { // Treat as a date. result = date_x.CompareTo(date_y); } else { // Treat as a string. result = string_x.CompareTo(string_y); } } // Return the correct result depending on whether // we're sorting ascending or descending. if (SortOrder == SortOrder.Ascending) { return result; } else { return -result; } } } }
2. ColumnClick 이벤트 method
private void listView1_ColumnClick(object sender, ColumnClickEventArgs e) { // Get the new sorting column. ColumnHeader new_sorting_column = listView1.Columns[e.Column]; // Figure out the new sorting order. System.Windows.Forms.SortOrder sort_order; if (SortingColumn == null) { // New column. Sort ascending. sort_order = SortOrder.Ascending; } else { // See if this is the same column. if (new_sorting_column == SortingColumn) { // Same column. Switch the sort order. if (SortingColumn.Text.StartsWith("> ")) { sort_order = SortOrder.Descending; } else { sort_order = SortOrder.Ascending; } } else { // New column. Sort ascending. sort_order = SortOrder.Ascending; } // Remove the old sort indicator. SortingColumn.Text = SortingColumn.Text.Substring(2); } // Display the new sort order. SortingColumn = new_sorting_column; if (sort_order == SortOrder.Ascending) { SortingColumn.Text = "> " + SortingColumn.Text; } else { SortingColumn.Text = "< " + SortingColumn.Text; } // Create a comparer. listView1.ListViewItemSorter = new ListViewComparer(e.Column, sort_order); // Sort. listView1.Sort(); // Display order column and sorting type toolStripStatusLabel1.Text = "Sorting : " + SortingColumn.Text; }
소스 파일 :
'C# with ListView' 카테고리의 다른 글
페이지 나누기가 있는 ListView (0) | 2015.05.07 |
---|---|
데이타베이스 4칙 연산(select, insert, delete, update) (0) | 2015.04.28 |