Last active
May 13, 2021 06:46
-
-
Save chengscott/d630a8721a2e6868bdf5 to your computer and use it in GitHub Desktop.
C# ListViewColumnSorter with NEW and AUTO key
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// 1. Paste the following code into the class for the form: | |
private ListViewColumnSorter lvwColumnSorter = new ListViewColumnSorter(); | |
// 2. Paste the following code into the constructor for the form, after the call to the InitializeComponent method: | |
this.listView1.ListViewItemSorter = lvwColumnSorter; | |
// 3. Paste the following code into the ColumnClick event for the ListView control: | |
// Determine if clicked column is already the column that is being sorted. | |
if (e.Column == lvwColumnSorter.SortColumn) | |
{ | |
// Reverse the current sort direction for this column. | |
if (lvwColumnSorter.Order == SortOrder.Ascending) | |
lvwColumnSorter.Order = SortOrder.Descending; | |
else | |
lvwColumnSorter.Order = SortOrder.Ascending; | |
} | |
else | |
{ | |
// Set the column number that is to be sorted; default to ascending. | |
lvwColumnSorter.SortColumn = e.Column; | |
lvwColumnSorter.Order = SortOrder.Ascending; | |
} | |
// Perform the sort with these new sort options. | |
this.listView1.Sort(); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
using System.Collections; | |
using System.Windows.Forms; | |
/// <summary> | |
/// This class is an implementation of the 'IComparer' interface. | |
/// </summary> | |
public class ListViewColumnSorter : IComparer | |
{ | |
/// <summary> | |
/// Specifies the column to be sorted | |
/// </summary> | |
private int ColumnToSort; | |
/// <summary> | |
/// Specifies the order in which to sort (i.e. 'Ascending'). | |
/// </summary> | |
private SortOrder OrderOfSort; | |
/// <summary> | |
/// Case insensitive comparer object | |
/// </summary> | |
private CaseInsensitiveComparer ObjectCompare; | |
/// <summary> | |
/// Class constructor. Initializes various elements | |
/// </summary> | |
public ListViewColumnSorter() | |
{ | |
// Initialize the column to '0' | |
ColumnToSort = 0; | |
// Initialize the sort order to 'none' | |
OrderOfSort = SortOrder.None; | |
// Initialize the CaseInsensitiveComparer object | |
ObjectCompare = new CaseInsensitiveComparer(); | |
} | |
/// <summary> | |
/// This method is inherited from the IComparer interface. It compares the two objects passed using a case insensitive comparison. | |
/// </summary> | |
/// <param name="x">First object to be compared</param> | |
/// <param name="y">Second object to be compared</param> | |
/// <returns>The result of the comparison. "0" if equal, negative if 'x' is less than 'y' and positive if 'x' is greater than 'y'</returns> | |
public int Compare(object x, object y) | |
{ | |
int compareResult; | |
ListViewItem listviewX, listviewY; | |
// Cast the objects to be compared to ListViewItem objects | |
listviewX = (ListViewItem)x; | |
listviewY = (ListViewItem)y; | |
// Deal with NEWKEY and AUTOKEY | |
if (listviewX.SubItems[0].Text == "*NEW" || listviewY.SubItems[0].Text == "*NEW") return -1; | |
if (listviewX.SubItems[0].Text == "[AUTO]") return (listviewY.SubItems[0].Text == "*NEW" ? 1 : -1); | |
if (listviewY.SubItems[0].Text == "[AUTO]") return (listviewX.SubItems[0].Text == "*NEW" ? 1 : -1); | |
// Compare the two items | |
compareResult = ObjectCompare.Compare(listviewX.SubItems[ColumnToSort].Text, listviewY.SubItems[ColumnToSort].Text); | |
// Calculate correct return value based on object comparison | |
if (OrderOfSort == SortOrder.Ascending) | |
{ | |
// Ascending sort is selected, return normal result of compare operation | |
return compareResult; | |
} | |
else if (OrderOfSort == SortOrder.Descending) | |
{ | |
// Descending sort is selected, return negative result of compare operation | |
return (-compareResult); | |
} | |
else | |
{ | |
// Return '0' to indicate they are equal | |
return 0; | |
} | |
} | |
/// <summary> | |
/// Gets or sets the number of the column to which to apply the sorting operation (Defaults to '0'). | |
/// </summary> | |
public int SortColumn | |
{ | |
set | |
{ | |
ColumnToSort = value; | |
} | |
get | |
{ | |
return ColumnToSort; | |
} | |
} | |
/// <summary> | |
/// Gets or sets the order of sorting to apply (for example, 'Ascending' or 'Descending'). | |
/// </summary> | |
public SortOrder Order | |
{ | |
set | |
{ | |
OrderOfSort = value; | |
} | |
get | |
{ | |
return OrderOfSort; | |
} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment