/// <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 = 0; ListViewItem listviewX, listviewY; // Cast the objects to be compared to ListViewItem objects listviewX = (ListViewItem)x; listviewY = (ListViewItem)y; ListView listViewMain = listviewX.ListView; // Calculate correct return value based on object comparison if (listViewMain != null && (listViewMain.Sorting != SortOrder.Ascending && listViewMain.Sorting != SortOrder.Descending)) { // Return '0' to indicate they are equal return(compareResult); } if (sortModifier.Equals(SortModifiers.SortByText) || ColumnToSort > 0) { // Compare the two items if (listviewX.SubItems.Count <= ColumnToSort && listviewY.SubItems.Count <= ColumnToSort) { compareResult = ObjectCompare.Compare(null, null); } else if (listviewX.SubItems.Count <= ColumnToSort && listviewY.SubItems.Count > ColumnToSort) { compareResult = ObjectCompare.Compare(null, listviewY.SubItems[ColumnToSort].Text.Trim()); } else if (listviewX.SubItems.Count > ColumnToSort && listviewY.SubItems.Count <= ColumnToSort) { compareResult = ObjectCompare.Compare(listviewX.SubItems[ColumnToSort].Text.Trim(), null); } else { compareResult = ObjectCompare.Compare(listviewX.SubItems[ColumnToSort].Text.Trim(), listviewY.SubItems[ColumnToSort].Text.Trim()); } } else { switch (sortModifier) { case SortModifiers.SortByCheckbox: compareResult = CheckBoxObjectCompare.Compare(x, y); break; case SortModifiers.SortByImage: compareResult = TextObjectCompare.Compare(x, y); break; case SortModifiers.SortCustom: compareResult = CustomCompare.Compare(x, y); break; default: compareResult = TextObjectCompare.Compare(x, y); break; } } // 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); } }