Ignore:
Timestamp:
Aug 2, 2022, 11:46:25 AM (2 years ago)
Author:
chronos
Message:
  • Modified: Various improvements.
File:
1 edited

Legend:

Unmodified
Added
Removed
  • Common/ListViewComparer.cs

    r1 r14  
    22using System.Windows.Forms;
    33using System.Runtime.InteropServices;
    4 using System.Globalization;
     4using System.Collections;
    55
    66namespace Common
    77{
    8     public enum ColumnDataType  { String, Integer, DateTime };
     8    public enum ColumnDataType { String, Integer, DateTime, Decimal, Custom };
    99
    1010    // Supports sorting by column in ascending or descending order
    11     public class ListViewItemComparer : System.Collections.IComparer
     11    public class ListViewItemComparer : IComparer
    1212    {
    13         private int column = 0;
    14         private SortOrder order = 0;
    15 
    16         public void ColumnClick(int column)
     13        private int column;
     14        private SortOrder order;
     15
     16        public void ColumnClick(int newColumn)
    1717        {
    1818            // Determine if clicked column is already the column that is being sorted.
    19             if (column == this.column)
     19            if (newColumn == column)
    2020            {
    2121                // Reverse the current sort direction for this column.
     
    3232            {
    3333                // Set the column number that is to be sorted; default to ascending.
    34                 this.column = column;
     34                column = newColumn;
    3535                order = SortOrder.Ascending;
    3636            }
    3737        }
    3838
    39         public void SetColumn(int column)
    40         {
    41             this.column = column;
    42         }
    43 
    44         public void SetOrder(SortOrder order)
    45         {
    46             this.order = order;
     39        public void SetColumn(int newColumn)
     40        {
     41            column = newColumn;
     42        }
     43
     44        public void SetOrder(SortOrder newOrder)
     45        {
     46            order = newOrder;
    4747        }
    4848
     
    5353        }
    5454
     55        public delegate int CompareItemEventHandler(ListViewItem x, ListViewItem y, int column);
     56
     57        public event CompareItemEventHandler OnCompareItem;
     58
    5559        public int Compare(object x, object y)
    5660        {
     61            ListViewItem listViewItemX = (ListViewItem)x;
     62            ListViewItem listViewItemY = (ListViewItem)y;
     63
    5764            int result = 0;
    58             if ((column < ((ListViewItem)x).SubItems.Count) && (column < ((ListViewItem)y).SubItems.Count) && (column >= 0))
    59             {
    60                 ColumnDataType dataType = ColumnDataType.String;
    61 
    62                 if (((ListViewItem)x).ListView.Columns[column].Tag != null)
    63                     dataType = (ColumnDataType)(((ListViewItem)x).ListView.Columns[column].Tag);
    64                 if (dataType == ColumnDataType.Integer)
    65                 {
    66                     int xi = 0;
    67                     int yi = 0;
    68                     if (int.TryParse(((ListViewItem)x).SubItems[column].Text, out xi) &&
    69                         int.TryParse(((ListViewItem)y).SubItems[column].Text, out yi))
    70                     {
    71                         if (xi < yi) result = -1;
    72                         else if (xi > yi) result = 1;
    73                         else result = 0;
    74                     }
    75                 } else
    76                 if (dataType == ColumnDataType.DateTime)
    77                 {
    78                     DateTime xi;
    79                     DateTime yi;
    80                     if (DateTime.TryParse(((ListViewItem)x).SubItems[column].Text, out xi) &&
    81                         DateTime.TryParse(((ListViewItem)y).SubItems[column].Text, out yi))
    82                     {
    83                         result = DateTime.Compare(xi, yi);
    84                     }
    85                 }
    86                 else result = String.Compare(((ListViewItem)x).SubItems[column].Text, ((ListViewItem)y).SubItems[column].Text);
    87             }
    88             if (order == SortOrder.Ascending)
    89             {
    90                 return result;
    91             }
    92             else if (order == SortOrder.Descending)
    93             {
    94                 return -result;
    95             }
    96             else
    97             {
    98                 return 0;
     65            if (listViewItemX != null && listViewItemY != null)
     66            {
     67                if (column < listViewItemX.SubItems.Count && column < listViewItemY.SubItems.Count && column >= 0)
     68                {
     69                    ColumnDataType dataType = ColumnDataType.String;
     70
     71                    if (listViewItemX.ListView.Columns[column].Tag != null)
     72                    {
     73                        dataType = (ColumnDataType) (listViewItemX.ListView.Columns[column].Tag);
     74                    }
     75
     76                    if (dataType == ColumnDataType.Integer)
     77                    {
     78                        if (int.TryParse(listViewItemX.SubItems[column].Text, out var xi) &&
     79                            int.TryParse(listViewItemY.SubItems[column].Text, out var yi))
     80                        {
     81                            if (xi < yi) result = -1;
     82                            else if (xi > yi) result = 1;
     83                            else result = 0;
     84                        }
     85                    }
     86                    else if (dataType == ColumnDataType.Decimal)
     87                    {
     88                        if (decimal.TryParse(listViewItemX.SubItems[column].Text, out var xi) &&
     89                            decimal.TryParse(listViewItemY.SubItems[column].Text, out var yi))
     90                        {
     91                            if (xi < yi) result = -1;
     92                            else if (xi > yi) result = 1;
     93                            else result = 0;
     94                        }
     95                    }
     96                    else if (dataType == ColumnDataType.DateTime)
     97                    {
     98                        if (DateTime.TryParse(listViewItemX.SubItems[column].Text, out var xi) &&
     99                            DateTime.TryParse(listViewItemY.SubItems[column].Text, out var yi))
     100                        {
     101                            result = DateTime.Compare(xi, yi);
     102                        }
     103                    }
     104                    else if (dataType == ColumnDataType.Custom)
     105                    {
     106                        if (OnCompareItem != null)
     107                        {
     108                            result = OnCompareItem(listViewItemX, listViewItemY, column);
     109                        }
     110                    }
     111                    else
     112                        result = string.CompareOrdinal(listViewItemX.SubItems[column].Text,
     113                            listViewItemY.SubItems[column].Text);
     114                }
     115                else
     116                {
     117                    if (!listViewItemX.Selected && listViewItemY.Selected) result = 1;
     118                    else if (listViewItemX.Selected && !listViewItemY.Selected) result = -1;
     119                }
     120            }
     121
     122            switch (order)
     123            {
     124                case SortOrder.Ascending:
     125                    return result;
     126                case SortOrder.Descending:
     127                    return -result;
     128                default:
     129                    return 0;
    99130            }
    100131        }
     
    103134        {
    104135            if (listView.ListViewItemSorter == null)
     136            {
    105137                listView.ListViewItemSorter = new ListViewItemComparer();
    106             (listView.ListViewItemSorter as ListViewItemComparer).SetOrder(order);
    107             (listView.ListViewItemSorter as ListViewItemComparer).SetColumn(column);
     138            }
     139
     140            ((ListViewItemComparer) listView.ListViewItemSorter).SetOrder(order);
     141            ((ListViewItemComparer) listView.ListViewItemSorter).SetColumn(column);
    108142            if ((column != -1) && (order != SortOrder.None))
    109143            {
     
    113147            listView.ColumnClick += delegate (object sender, ColumnClickEventArgs e)
    114148            {
    115                 ((sender as ListView).ListViewItemSorter as ListViewItemComparer).ColumnClick(e.Column);
    116                 (sender as ListView).Sort();
    117                 (sender as ListView).SetSortIcon(((sender as ListView).ListViewItemSorter as ListViewItemComparer).column, ((sender as ListView).ListViewItemSorter as ListViewItemComparer).order);
     149                ((ListViewItemComparer) ((ListView) sender).ListViewItemSorter).ColumnClick(e.Column);
     150                ((ListView) sender).Sort();
     151                ((ListView) sender).SetSortIcon(((ListViewItemComparer) ((ListView) sender).ListViewItemSorter).column, ((ListViewItemComparer) ((ListView) sender).ListViewItemSorter).order);
    118152            };
    119153        }
     
    181215
    182216
    183         //This method used to set arrow icon
     217        // This method used to set arrow icon
    184218        public static void SetSortIcon(this ListView listView, int columnIndex, SortOrder order)
    185219        {
     
    189223            {
    190224                IntPtr columnPtr = new IntPtr(columnNumber);
    191                 LVCOLUMN lvColumn = new LVCOLUMN();
    192                 lvColumn.mask = HDI_FORMAT;
     225                LVCOLUMN lvColumn = new LVCOLUMN {mask = HDI_FORMAT};
    193226
    194227                SendMessageLVCOLUMN(columnHeader, HDM_GETITEM, columnPtr, ref lvColumn);
    195228
    196                 if (!(order == SortOrder.None) && columnNumber == columnIndex)
     229                if (order != SortOrder.None && columnNumber == columnIndex)
    197230                {
    198231                    switch (order)
    199232                    {
    200                         case System.Windows.Forms.SortOrder.Ascending:
     233                        case SortOrder.Ascending:
    201234                            lvColumn.fmt &= ~HDF_SORTDOWN;
    202235                            lvColumn.fmt |= HDF_SORTUP;
    203236                            break;
    204                         case System.Windows.Forms.SortOrder.Descending:
     237                        case SortOrder.Descending:
    205238                            lvColumn.fmt &= ~HDF_SORTUP;
    206239                            lvColumn.fmt |= HDF_SORTDOWN;
Note: See TracChangeset for help on using the changeset viewer.