? Bạn cần sắp xếp một ListView, nhưng phương thức nội tại ListView.Sort chỉ sắp xếp căn cứ trên cột đầu tiên.
» Tạo một hiện thực cho giao diện System.Collections.IComparer để có thể sắp xếp các đối tượng ListViewItem (kiểu IComparer có thể sắp xếp dựa trên bất kỳ tiêu chuẩn nào bạn muốn). Thiết lập thuộc tính ListView.ListViewItemSorter với một đối tượng của kiểu IComparer trước khi gọi phương thức ListView.Sort.
ListView cung cấp phương thức Sort để sắp các item theo thứ tự alphabet dựa trên phần text trong cột đầu tiên. Nếu muốn sắp xếp dựa trên các giá trị cột khác hoặc sắp thứ tự các item theo bất kỳ cách nào khác, bạn cần tạo một hiện thực tùy biến của giao diện IComparer.
Giao diện IComparer định nghĩa một phương thức có tên là Compare, phương thức này nhận vào hai đối tượng và xác định đối tượng nào sẽ được sắp trước. Lớp tùy biến ListViewItemComparer dưới đây hiện thực giao diện IComparer và cấp thêm hai thuộc tính: Column và Numeric. Trong đó, Column cho biết cột nào sẽ được sử dụng để sắp xếp; và Numeric là một cờ Boolean, được thiết lập là true nếu muốn thực hiện việc so sánh theo thứ tự số thay vì so sánh theo thứ tự alphabet.
Visual C# Code:
  1. using System;
  2. using System.Collections;
  3. using System.Windows.Forms;
  4.  
  5. public class ListViewItemComparer : IComparer {
  6.  
  7.     private int column;
  8.     private bool numeric = false;
  9.  
  10.     public int Column {
  11.    
  12.         get {return column;}
  13.         set {column = value;}
  14.     }
  15.        
  16.     public bool Numeric {
  17.    
  18.         get {return numeric;}
  19.         set {numeric = value;}
  20.     }
  21.        
  22.     public ListViewItemComparer(int columnIndex) {
  23.    
  24.         Column = columnIndex;
  25.     }
  26.  
  27.     public int Compare(object x, object y) {
  28.    
  29.         ListViewItem listX = (ListViewItem)x;
  30.         ListViewItem listY = (ListViewItem)y;
  31.  
  32.         if (Numeric) {
  33.        
  34.             // Chuyển text thành số trước khi so sánh.
  35.             // Nếu chuyển đổi thất bại, sử dụng giá trị 0.
  36.             decimal listXVal, listYVal;
  37.             try {
  38.                 listXVal = Decimal.Parse(listX.SubItems[Column].Text);
  39.             }
  40.             catch {
  41.                 listXVal = 0;
  42.             }
  43.  
  44.             try {
  45.                  listYVal = Decimal.Parse(listY.SubItems[Column].Text);
  46.             }
  47.             catch {
  48.                  listYVal = 0;
  49.             }
  50.  
  51.             return Decimal.Compare(listXVal, listYVal);
  52.         }
  53.         else {
  54.        
  55.             // Giữ nguyên text ở định dạng chuỗi
  56.             // và thực hiện so sánh theo thứ tự alphabetic.
  57.             string listXText = listX.SubItems[Column].Text;
  58.             string listYText = listY.SubItems[Column].Text;
  59.  
  60.             return String.Compare(listXText, listYText);
  61.         }
  62.     }
  63. }
Bây giờ, để sắp xếp ListView, bạn cần tạo một đối tượng ListViewItemComparer, cấu hình cho nó một cách hợp lý, và rồi thiết lập nó vào thuộc tính ListView.ListViewItemSorter trước khi gọi phương thức ListView.Sort.
Form dưới đây trình bày một thử nghiệm đơn giản cho ListViewItemComparer. Mỗi khi người dùng nhắp vào header của một cột trong ListView thì ListViewItemComparer sẽ được tạo ra và được sử dụng để sắp xếp danh sách dựa trên cột đó.

Visual C# Code:
  1. using System;
  2. using System.Windows.Forms;
  3.  
  4. public class ListViewItemSort : System.Windows.Forms.Form {
  5.  
  6.     // (Bỏ qua phần mã designer.)
  7.  
  8.     private void ListView1_ColumnClick(object sender,
  9.       System.Windows.Forms.ColumnClickEventArgs e) {
  10.    
  11.         ListViewItemComparer sorter = new ListViewItemComparer(e.Column);
  12.         ListView1.ListViewItemSorter = sorter;
  13.         ListView1.Sort();
  14.     }
  15. }

Trích từ "Các giải pháp lập trình C#"