andrew4582

ListViewHelper

Jul 1st, 2012
175
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 17.90 KB | None | 0 0
  1. using System.Collections.Generic;
  2. using System.Data;
  3. using System.Reflection;
  4.  
  5.  
  6. namespace System.Windows.Forms {
  7.     public class ListViewHelper {
  8.         public event ListViewSortEvent ItemSorted;
  9.         public event EventHandler AfterItemsSorted;
  10.  
  11.         readonly ListView _listView;
  12.         readonly ListView listView1;
  13.         Dictionary<ColumnHeader,SortOrder> _sortedColumns = new Dictionary<ColumnHeader,SortOrder>();
  14.  
  15.         public int RemoveSelectedListViewItems() {
  16.             List<ListViewItem> selectedItems = GetSelectedListViewItems();
  17.             foreach(ListViewItem li in selectedItems)
  18.                 listView1.Items.Remove(li);
  19.             return selectedItems.Count;
  20.         }
  21.         public List<ListViewItem> GetSelectedListViewItems() {
  22.             List<ListViewItem> list = new List<ListViewItem>();
  23.             foreach(ListViewItem li in listView1.SelectedItems)
  24.                 list.Add(li);
  25.             return list;
  26.         }
  27.         public T GetSelectedListViewItemTag<T>() {
  28.             ListViewItem li = GetSelectedListViewItem();
  29.             if(li == null)
  30.                 return default(T);
  31.             return (T)li.Tag;
  32.         }
  33.  
  34.  
  35.         public ListViewItem GetSelectedListViewItem() {
  36.             return GetSelectedListViewItem(false);
  37.         }
  38.         public ListViewItem GetSelectedListViewItem(bool createIfNotFound) {
  39.             if(listView1.SelectedItems.Count == 0) {
  40.                 if(!createIfNotFound)
  41.                     return null;
  42.                 return new ListViewItem();
  43.             }
  44.             return listView1.SelectedItems[0];
  45.         }
  46.  
  47.  
  48.         public ListViewItem[] AddListViewItems(DataTable table) {
  49.             List<ListViewItem> list = new List<ListViewItem>();
  50.             for(int i = 0;i < table.Rows.Count;i++)
  51.                 list.Add(AddListViewItem(table.Rows[i]));
  52.             return list.ToArray();
  53.         }
  54.         public ListViewItem[] AddListViewItems(object[][] data) {
  55.             List<ListViewItem> list = new List<ListViewItem>();
  56.             for(int i = 0;i < data.Length;i++)
  57.                 list.Add(AddListViewItem(data[i]));
  58.             return list.ToArray();
  59.         }
  60.         public ListViewItem AddListViewItem(DataRow row) {
  61.             List<string> tableColNames = new List<string>();
  62.             DataTable table = row.Table;
  63.  
  64.             if(table.Rows.Count == listView1.Columns.Count)
  65.                 return AddListViewItem(row.ItemArray);
  66.  
  67.             for(int i = 0;i < table.Columns.Count;i++) {
  68.                 tableColNames.Add(table.Columns[i].ToString());
  69.             }
  70.             return AddListViewItem(row.ItemArray,tableColNames.ToArray());
  71.         }
  72.  
  73.         public ListViewItem AddListViewItem(object[] data,string[] columnNames) {
  74.             ListView.ColumnHeaderCollection lvcolumns = listView1.Columns;
  75.             if(lvcolumns.Count != columnNames.Length)
  76.                 lvcolumns.Clear();
  77.             foreach(string colName in columnNames)
  78.                 lvcolumns.Add(colName,colName);
  79.  
  80.             List<string> dataAsString = new List<string>(data.Length);
  81.             if(data.Length != lvcolumns.Count) {
  82.                 for(int i = 0;i < lvcolumns.Count;i++) {
  83.                     object fldData = data[i];
  84.                     if(fldData == null)
  85.                         fldData = "";
  86.                     else if(fldData == DBNull.Value)
  87.                         fldData = "";
  88.                     dataAsString.Add(fldData.ToString());
  89.                 }
  90.                 return AddListViewItem(dataAsString.ToArray());
  91.             }
  92.             else
  93.                 return AddListViewItem(data);
  94.         }
  95.         public ListViewItem AddListViewItem(string text) {
  96.             return AddListViewItem(new string[] { text });
  97.         }
  98.  
  99.         public ListViewItem AddListViewItem(object obj) {
  100.             if(ListView.Columns.Count == 0)
  101.                 CreateColumnHeaders(obj.GetType());
  102.  
  103.             Dictionary<string,string> properties = GetProperties(obj);
  104.             if(properties.Count == 0)
  105.                 return null;
  106.             ListViewItem li = new ListViewItem();
  107.  
  108.             for(int i = 0;i < ListView.Columns.Count;i++) {
  109.                 ColumnHeader colHeader = ListView.Columns[i];
  110.  
  111.                 if(!properties.ContainsKey(colHeader.Name))
  112.                     continue;
  113.                 if(i == 0)
  114.                     li.Text = properties[colHeader.Name];
  115.                 else
  116.                     li.SubItems.Add(properties[colHeader.Name]);
  117.             }
  118.             //foreach (string key in properties.Keys)
  119.             //{
  120.             //    string objPropVal = properties[key];
  121.  
  122.             //}
  123.             //ListViewItem li = new ListViewItem(new StringList().ToArray());
  124.             //StringList list = new StringList(properties.Keys);
  125.             li.Tag = obj;
  126.             ListView.Items.Add(li);
  127.             return li;
  128.         }
  129.         public ListViewItem AddListViewItem(object[] fields) {
  130.             List<string> dataAsString = new List<string>(fields.Length);
  131.             for(int i = 0;i < ListView.Columns.Count;i++) {
  132.                 object fldData = fields[i];
  133.                 if(fldData == null)
  134.                     fldData = "";
  135.                 else if(fldData == DBNull.Value)
  136.                     fldData = "";
  137.                 dataAsString.Add(fldData.ToString());
  138.             }
  139.             return AddListViewItem(dataAsString.ToArray());
  140.         }
  141.         public ListViewItem AddListViewItem(string[] fields) {
  142.             ListViewItem li = new ListViewItem(fields);
  143.             li.EnsureVisible();
  144.             listView1.Items.Add(li);
  145.             return li;
  146.         }
  147.         //public ColumnHeader[] GetColumnHeaders(Type t, params string[] includeOnlyColumns)
  148.         //{
  149.         //    List<ColumnHeader> list = new List<ColumnHeader>();
  150.         //    Dictionary<string, string> properties = GetProperties(t);
  151.  
  152.         //    if (includeOnlyColumns.Length == 0)
  153.         //    {
  154.         //        foreach (string propName in properties.Keys)
  155.         //        {
  156.         //            int propIndex = properties[propName];
  157.         //            ColumnHeader col = new ColumnHeader();
  158.         //            col.Text = propName;
  159.         //            col.Name = propName;
  160.         //            list.Insert(propIndex, col);
  161.         //        }
  162.         //        return list.ToArray();
  163.         //    }
  164.         //    foreach (string propName in properties.Keys)
  165.         //    {
  166.         //        for (int j = 0; j < includeOnlyColumns.Length; j++)
  167.         //        {
  168.         //            if(propName == includeOnlyColumns[j])
  169.         //            {
  170.         //                int propIndex = properties[propName];
  171.         //                ColumnHeader col = new ColumnHeader();
  172.         //                col.Text = propName;
  173.         //                col.Name = propName;
  174.         //                list.Insert(propIndex, col);
  175.         //            }
  176.         //        }
  177.         //    }
  178.         //    return list.ToArray();
  179.         //}
  180.  
  181.         private static Dictionary<string,string> GetProperties(object obj) {
  182.             Type t = obj.GetType();
  183.             Dictionary<string,string> properties = new Dictionary<string,string>();
  184.             PropertyInfo[] propInfos = t.GetProperties();
  185.             for(int i = 0;i < propInfos.Length;i++) {
  186.                 object ret = propInfos[i].GetValue(obj,null);
  187.                 if(ret == null)
  188.                     ret = "";
  189.                 properties.Add(propInfos[i].Name,ret.ToString());
  190.             }
  191.             return properties;
  192.         }
  193.         public ColumnHeader[] CreateColumnHeaders(Type t) {
  194.             return CreateColumnHeaders(t.GetType(),null);
  195.         }
  196.         public ColumnHeader[] CreateColumnHeaders(Type t,params string[] includeOnlyColumns) {
  197.             this.ListView.Columns.Clear();
  198.             List<ColumnHeader> list = new List<ColumnHeader>();
  199.             PropertyInfo[] properties = t.GetProperties();
  200.             if(includeOnlyColumns == null)
  201.                 includeOnlyColumns = new string[] { };
  202.  
  203.             if(includeOnlyColumns.Length > 0) {
  204.                 foreach(string include in includeOnlyColumns) {
  205.                     for(int i = 0;i < properties.Length;i++) {
  206.                         PropertyInfo prop = properties[i];
  207.                         if(!prop.CanRead)
  208.                             continue;
  209.                         if(!include.Equals(prop.Name))
  210.                             continue;
  211.                         ColumnHeader col = new ColumnHeader();
  212.                         col.Text = prop.Name;
  213.                         col.Name = prop.Name;
  214.                         list.Add(col);
  215.                         ListView.Columns.Add(col);
  216.                     }
  217.                 }
  218.             }
  219.             else {
  220.                 for(int i = 0;i < properties.Length;i++) {
  221.                     PropertyInfo prop = properties[i];
  222.                     if(!prop.CanRead)
  223.                         continue;
  224.                     ColumnHeader col = new ColumnHeader();
  225.                     col.Text = prop.Name;
  226.                     col.Name = prop.Name;
  227.                     list.Add(col);
  228.                     ListView.Columns.Add(col);
  229.                 }
  230.                 //foreach (ColumnHeader co in list)
  231.                 //    for (int i = 0; i < includeOnlyColumns.Length; i++)
  232.                 //        if (co.Text == includeOnlyColumns[i])
  233.                 //            ListView.Columns.Insert(ListView.Columns.Count, co);
  234.             }
  235.             return list.ToArray();
  236.         }
  237.         //private bool DoColumnHeadersMatch(PropertyInfo[] infos, string[] includeOnlyColumns)
  238.         //{
  239.         //    if (includeOnlyColumns != null)
  240.         //        if (includeOnlyColumns.Length > 0)
  241.         //            return DoColumnHeadersMatch(includeOnlyColumns);
  242.  
  243.         //    List<string> list = new List<string>();
  244.         //    foreach (PropertyInfo p in infos)
  245.         //        list.Add(p.Name);
  246.         //    return DoColumnHeadersMatch(list.ToArray());
  247.         //}
  248.         //private bool DoColumnHeadersMatch(string[] headerText)
  249.         //{
  250.         //    foreach (ColumnHeader col in ListView.Columns)
  251.         //    {
  252.         //        bool foundIt = false;
  253.         //        foreach (string s in headerText)
  254.         //        {
  255.         //            if (s == col.Text)
  256.         //            {
  257.         //                foundIt = true;
  258.         //                break;
  259.         //            }
  260.         //        }
  261.         //        if (!foundIt)
  262.         //            return false;
  263.         //    }
  264.         //    return false;
  265.         //}
  266.  
  267.  
  268.         public ListView ListView {
  269.             get { return _listView; }
  270.            
  271.         }
  272.  
  273.         public ListViewHelper(ListView p_ListView) {
  274.             _listView = p_ListView;
  275.             listView1 = p_ListView;
  276.  
  277.             _listView.ColumnClick += new ColumnClickEventHandler(ListView_ColumnClick);
  278.         }
  279.  
  280.         private void ListView_ColumnClick(object sender,ColumnClickEventArgs e) {
  281.             ColumnHeader column = ListView.Columns[e.Column];
  282.             SortByColumn(column);
  283.         }
  284.         public void SortByColumn(int columnIndex) {
  285.             SortByColumn(ListView.Columns[columnIndex]);
  286.         }
  287.         public void SortByColumn(int columnIndex,SortOrder order) {
  288.             SortByColumn(ListView.Columns[columnIndex],order);
  289.         }
  290.         public void SortByColumn(ColumnHeader column) {
  291.             SortByColumn(column,SortOrder.None);
  292.         }
  293.  
  294.         public SortOrder GetSortOrder(ColumnHeader column,SortOrder order = SortOrder.None) {
  295.            
  296.             if(!_sortedColumns.ContainsKey(column))
  297.                 _sortedColumns.Add(column,SortOrder.Ascending);
  298.  
  299.             if(order == SortOrder.None) {
  300.                 if(_sortedColumns[column] == SortOrder.Ascending)
  301.                     _sortedColumns[column] = SortOrder.Descending;
  302.                 else
  303.                     _sortedColumns[column] = SortOrder.Ascending;
  304.             }
  305.             else
  306.                 _sortedColumns[column] = order;
  307.  
  308.             return _sortedColumns[column];
  309.         }
  310.  
  311.         public void SortByColumn(ColumnHeader column,SortOrder order) {
  312.             if(ListView.VirtualMode) {
  313.                 return;
  314.             }
  315.  
  316.             ListView.Sort();
  317.            
  318.             List<ListViewItem> items = new List<ListViewItem>();
  319.             Dictionary<ListViewItem,ListViewGroup> groups = new Dictionary<ListViewItem,ListViewGroup>();
  320.             foreach(ListViewItem li in ListView.Items) {
  321.                 items.Add(li);
  322.                 groups.Add(li,li.Group);
  323.             }
  324.  
  325.             ListView.Items.Clear();
  326.  
  327.             if(!_sortedColumns.ContainsKey(column))
  328.                 _sortedColumns.Add(column,SortOrder.Ascending);
  329.  
  330.             if(order == SortOrder.None) {
  331.                 if(_sortedColumns[column] == SortOrder.Ascending)
  332.                     _sortedColumns[column] = SortOrder.Descending;
  333.                 else
  334.                     _sortedColumns[column] = SortOrder.Ascending;
  335.             }
  336.             else
  337.                 _sortedColumns[column] = order;
  338.  
  339.  
  340.             ListViewItemSort liSort = new ListViewItemSort(column.Index,_sortedColumns[column]);
  341.             liSort.ItemSorted += new ListViewSortEvent(liSort_ItemSorted);
  342.             items.Sort(liSort);
  343.             ListView.Sorting = SortOrder.None;
  344.  
  345.             foreach(ListViewItem li in items)
  346.                 li.Group = groups[li];
  347.  
  348.             ListView.Items.AddRange(items.ToArray());
  349.  
  350.             if(AfterItemsSorted != null)
  351.                 AfterItemsSorted(this,new EventArgs());
  352.  
  353.         }
  354.  
  355.         void liSort_ItemSorted(object sender,ListViewSortEventArgs e) {
  356.             if(ItemSorted != null)
  357.                 ItemSorted(this,e);
  358.         }
  359.         public class ListViewItemSort:Comparer<ListViewItem> {
  360.             private int m_ColumnToSortBy;
  361.             private Type m_ColumnDataType;
  362.             private SortOrder m_SortOrder;
  363.  
  364.             public event ListViewSortEvent ItemSorted;
  365.  
  366.             public Type ColumnDataType {
  367.                 get { return m_ColumnDataType; }
  368.                 set { m_ColumnDataType = value; }
  369.             }
  370.  
  371.  
  372.             public SortOrder SortOrder {
  373.                 get { return m_SortOrder; }
  374.                 set { m_SortOrder = value; }
  375.             }
  376.  
  377.             public int ColumnToSortBy {
  378.                 get { return m_ColumnToSortBy; }
  379.                 set { m_ColumnToSortBy = value; }
  380.             }
  381.             public ListViewItemSort() { }
  382.             public ListViewItemSort(int p_ColumnToSortBy) : this(p_ColumnToSortBy,SortOrder.Ascending) { }
  383.             public ListViewItemSort(int p_ColumnToSortBy,SortOrder order)
  384.                 : this(p_ColumnToSortBy,order,null) {
  385.             }
  386.             public ListViewItemSort(int p_ColumnToSortBy,SortOrder order,Type p_ColumnDataType) {
  387.                 m_SortOrder = order;
  388.                 m_ColumnToSortBy = p_ColumnToSortBy;
  389.                 m_ColumnDataType = p_ColumnDataType;
  390.             }
  391.             private string GetValueForItem(ListViewItem li) {
  392.                 if(ItemSorted != null) {
  393.                     ListViewSortEventArgs args = new ListViewSortEventArgs(li,li.SubItems[m_ColumnToSortBy].Text,m_ColumnToSortBy);
  394.                     ItemSorted(this,args);
  395.                     if(args.DataToSort == null)
  396.                         return li.Text;
  397.                     return args.DataToSort.ToString();
  398.                 }
  399.                 return li.SubItems[m_ColumnToSortBy].Text;
  400.             }
  401.             public override int Compare(ListViewItem x,ListViewItem y) {
  402.                 //Dictionary<ListViewItem,List<ColumnHeader>>
  403.  
  404.                 string Xvalue = GetValueForItem(x);
  405.                 string Yvalue = GetValueForItem(y);
  406.  
  407.                 int int_x = 0,int_y = 0;
  408.                 DateTime dt_x = DateTime.MinValue,dt_y = DateTime.MinValue;
  409.  
  410.                 if(int.TryParse(Xvalue,out int_x) && int.TryParse(Yvalue,out int_y)) {
  411.                     if(SortOrder == SortOrder.Ascending)
  412.                         return Comparer<int>.Default.Compare(int_x,int_y);
  413.                     return Comparer<int>.Default.Compare(int_y,int_x);
  414.                 }
  415.                 else if(DateTime.TryParse(Xvalue,out dt_x) && DateTime.TryParse(Yvalue,out dt_y)) {
  416.                     if(SortOrder == SortOrder.Ascending)
  417.                         return Comparer<DateTime>.Default.Compare(dt_x,dt_y);
  418.                     return Comparer<DateTime>.Default.Compare(dt_y,dt_x);
  419.                 }
  420.                 else {
  421.                     if(SortOrder == SortOrder.Ascending)
  422.                         return StringComparer.Create(System.Globalization.CultureInfo.CurrentCulture,false).Compare(Xvalue,Yvalue);
  423.                     return StringComparer.Create(System.Globalization.CultureInfo.CurrentCulture,false).Compare(Yvalue,Xvalue);
  424.                 }
  425.             }
  426.         }
  427.     }
  428.     public delegate void ListViewSortEvent(object sender,ListViewSortEventArgs e);
  429.     public class ListViewSortEventArgs:EventArgs {
  430.         private ListViewItem m_Item;
  431.         private object m_DataToSort;
  432.         private int m_ColumnToSortBy;
  433.  
  434.  
  435.         public ListViewItem Item {
  436.             get { return m_Item; }
  437.             set { m_Item = value; }
  438.         }
  439.  
  440.         public object DataToSort {
  441.             get { return m_DataToSort; }
  442.             set { m_DataToSort = value; }
  443.         }
  444.  
  445.         public int ColumnToSortBy {
  446.             get { return m_ColumnToSortBy; }
  447.             set { m_ColumnToSortBy = value; }
  448.         }
  449.  
  450.         public ListViewSortEventArgs() {
  451.  
  452.         }
  453.  
  454.         public ListViewSortEventArgs(ListViewItem p_Item,
  455.             object p_DataToSort,
  456.             int p_ColumnToSortBy) {
  457.             this.m_Item = p_Item;
  458.             this.m_DataToSort = p_DataToSort;
  459.             this.m_ColumnToSortBy = p_ColumnToSortBy;
  460.  
  461.         }
  462.     }
  463.  
  464. }
Advertisement
Add Comment
Please, Sign In to add comment