ListViewExtension.cs 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134
  1. using qdr.app.studiou.orders2printpack.ProductStorage;
  2. using System.Collections;
  3. using System.Reflection;
  4. namespace qdr.app.studiou.orders2printpack.Extensions
  5. {
  6. public static class ListViewExtensions
  7. {
  8. public static void BindData<TClass>(this ListView listView, IEnumerable<TClass> data, bool enableSorting = true, Action<ListViewItem,TClass>? itemCustomProcessCallback = null)
  9. where TClass : class, IIdentifierGetter
  10. {
  11. if (data == null)
  12. throw new ArgumentNullException(nameof(data));
  13. listView.BeginUpdate();
  14. listView.Items.Clear();
  15. // Get properties of the class
  16. var properties = typeof(TClass).GetProperties(BindingFlags.Public | BindingFlags.Instance);
  17. // Add data to the ListView
  18. foreach (var item in data)
  19. AddItemInternal(listView, properties, item, itemCustomProcessCallback: itemCustomProcessCallback);
  20. // Auto-resize columns
  21. listView.AutoResizeColumns(ColumnHeaderAutoResizeStyle.HeaderSize);
  22. if (enableSorting)
  23. {
  24. EnableSorting(listView);
  25. }
  26. listView.EndUpdate();
  27. }
  28. public static ListViewItem AddItem<TClass>(this ListView listView, TClass item, bool selectItem = false)
  29. where TClass : class, IIdentifierGetter
  30. {
  31. if (item == null)
  32. throw new ArgumentNullException(nameof(item));
  33. // Get properties of the class
  34. var properties = typeof(TClass).GetProperties(BindingFlags.Public | BindingFlags.Instance);
  35. var lvItem = AddItemInternal<TClass>(listView, properties, item);
  36. if (selectItem)
  37. lvItem.Selected = true;
  38. return lvItem;
  39. }
  40. private static ListViewItem AddItemInternal<TClass>(ListView listView, PropertyInfo[] properties, TClass item, bool selectItem = false, Action<ListViewItem, TClass>? itemCustomProcessCallback = null)
  41. where TClass : class, IIdentifierGetter
  42. {
  43. var row = new string[listView.Columns.Count];
  44. foreach (var column in listView.Columns)
  45. {
  46. var header = column as ColumnHeader;
  47. if (header == null)
  48. continue;
  49. var property = properties.FirstOrDefault(p => string.Equals(p.Name, header.Tag?.ToString(), StringComparison.CurrentCultureIgnoreCase));
  50. if (property == null)
  51. continue;
  52. var value = property.GetValue(item);
  53. var ordinal = header.DisplayIndex;
  54. row[ordinal] = value?.ToString() ?? "";
  55. }
  56. var lvItem = new ListViewItem(row);
  57. lvItem.Tag = item.GetIdentifier();
  58. if (itemCustomProcessCallback != null)
  59. itemCustomProcessCallback(lvItem, item);
  60. listView.Items.Add(lvItem);
  61. return lvItem;
  62. }
  63. public static void SaveSelection(this ListView listView)
  64. {
  65. listView.Tag = listView.SelectedItems.Cast<ListViewItem>().Select(x => x.Tag?.ToString()).ToArray();
  66. }
  67. public static void RestoreSelection(this ListView listView)
  68. {
  69. if (listView.Tag == null)
  70. return;
  71. var identifiers = (string[])listView.Tag;
  72. foreach (var identifier in identifiers)
  73. {
  74. var item = listView.Items.Cast<ListViewItem>().FirstOrDefault(x => string.Equals(x.Tag?.ToString(), identifier));
  75. if (item != null)
  76. item.Selected = true;
  77. }
  78. listView.Tag = null;
  79. }
  80. private static void EnableSorting(ListView listView)
  81. {
  82. listView.ListViewItemSorter = new ListViewItemComparer();
  83. listView.ColumnClick += (sender, e) =>
  84. {
  85. var sorter = (ListViewItemComparer)listView.ListViewItemSorter;
  86. sorter.Column = e.Column;
  87. sorter.Order = sorter.Order == SortOrder.Ascending ? SortOrder.Descending : SortOrder.Ascending;
  88. listView.Sort();
  89. };
  90. }
  91. private class ListViewItemComparer : IComparer
  92. {
  93. public int Column { get; set; }
  94. public SortOrder Order { get; set; }
  95. public ListViewItemComparer()
  96. {
  97. Column = 0;
  98. Order = SortOrder.Ascending;
  99. }
  100. public int Compare(object? x, object? y)
  101. {
  102. var xobj = x as ListViewItem;
  103. var yobj = y as ListViewItem;
  104. int compareResult = string.Compare(xobj?.SubItems[Column].Text, yobj?.SubItems[Column].Text);
  105. return Order == SortOrder.Ascending ? compareResult : -compareResult;
  106. }
  107. }
  108. }
  109. }