MobileDataGrid.xaml.cs 30 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751
  1. using comal.timesheets.Data_Classes;
  2. using comal.timesheets.Deliveries;
  3. using InABox.Clients;
  4. using InABox.Core;
  5. using Syncfusion.XForms.PopupLayout;
  6. using System;
  7. using System.Collections.Generic;
  8. using System.Collections.ObjectModel;
  9. using System.Collections.Specialized;
  10. using System.IO;
  11. using System.Linq;
  12. using System.Reflection;
  13. using Xamarin.Forms;
  14. using Xamarin.Forms.Xaml;
  15. namespace comal.timesheets
  16. {
  17. public enum DataGridSaveType
  18. {
  19. None,
  20. Single,
  21. Multiple
  22. }
  23. public delegate void DataGridOptionsSet(string title, DataGridSaveType savetype = DataGridSaveType.None);
  24. public delegate object DataGridItemSelected(DataGridViewModelItem item);
  25. public delegate object DataGridImageSelected(DataGridViewModelItem item);
  26. [XamlCompilation(XamlCompilationOptions.Compile)]
  27. public partial class MobileDataGrid : ContentView
  28. {
  29. public event DataGridOptionsSet OnOptionsSet;
  30. public event DataGridItemSelected OnItemSelected;
  31. public event DataGridImageSelected OnImageSelected;
  32. public List<DataGridViewModelItem> Items { get; set; }
  33. DataGridSaveType SaveType { get; set; }
  34. bool bSearching = false;
  35. ObservableCollection<DataGridFilter> Filters = new ObservableCollection<DataGridFilter>();
  36. List<DataGridViewModelItem> CurrentItems = new List<DataGridViewModelItem>();
  37. PropertyInfo[] info = typeof(DataGridViewModelItem).GetProperties();
  38. Dictionary<string, List<string>> FilterOptions = new Dictionary<string, List<string>>();
  39. Type Type;
  40. SfPopupLayout popupLayout;
  41. /// <summary>
  42. /// To create a grid of a new kind, add a new class to the shared code and inherit from MobileDataGrid
  43. /// - Create a new DataGridHost (page) and pass the grid as a parameter
  44. /// - Within the new grid, pass the required data into the "Setup" method (max of 4 columns - defined in each item's Data (List of Tuples<string, string> )
  45. /// - See ProductsGrid or an existing grid for examples
  46. /// - Grid custom behaviour can be defined using events
  47. /// - Custom behaviour can be defined for all grids of that kind (defined on the grid itself), or from the host page (different behaviour for the same grid, based on where it is called from)
  48. /// </summary>
  49. public MobileDataGrid()
  50. {
  51. InitializeComponent();
  52. Items = new List<DataGridViewModelItem>();
  53. Filters.CollectionChanged += Filters_CollectionChanged;
  54. SetupPopupLayout();
  55. }
  56. private void SetupPopupLayout()
  57. {
  58. popupLayout = new SfPopupLayout();
  59. popupLayout.PopupView.WidthRequest = 600;
  60. popupLayout.PopupView.HeightRequest = 600;
  61. popupLayout.PopupView.HeaderTitle = "Detail";
  62. popupLayout.PopupView.AcceptButtonText = "Close";
  63. }
  64. #region Grid Setup
  65. public void Setup(List<DataGridViewModelItem> items, Type type, DataGridSaveType savetype = DataGridSaveType.None)
  66. {
  67. if (items == null || items.Count == 0)
  68. return;
  69. Type = type;
  70. Items = items;
  71. Device.BeginInvokeOnMainThread(() =>
  72. {
  73. SetupHeaders(items.First());
  74. Refresh(Items);
  75. });
  76. OnOptionsSet?.Invoke(type.Name, savetype);
  77. SaveType = savetype;
  78. }
  79. /// <summary>
  80. /// Never pass CurrentItems into this function
  81. /// - Create an intermediate list first
  82. /// - CurrentItems gets cleared in order to be reset properly
  83. /// </summary>
  84. /// <param name="items"></param>
  85. public void Refresh(List<DataGridViewModelItem> items)
  86. {
  87. itemsListView.ItemsSource = items;
  88. countLbl.Text = items.Count + " Records";
  89. CurrentItems.Clear();
  90. foreach (var item in items)
  91. {
  92. CurrentItems.Add(item);
  93. }
  94. if (Filters.Any())
  95. filterBtnRow.Height = 80;
  96. else
  97. filterBtnRow.Height = 0;
  98. int count = 0;
  99. foreach (var column in Items.First().Data)
  100. {
  101. var filter = Filters.FirstOrDefault(x => x.ColNumber == "Col" + count);
  102. if (filter != null)
  103. ChangeHeaderColour(true, count);
  104. else
  105. ChangeHeaderColour(false, count);
  106. count++;
  107. }
  108. }
  109. public void SetupHeaders(DataGridViewModelItem item)
  110. {
  111. var count = GenerateHeaders(item);
  112. GenerateImageHeader(item, count);
  113. SelectListViewTemplate(item);
  114. }
  115. //only way to reliably get the desired layout/correct bindings dynamically - viewcells are predefined in DataGrid/View/Templates folder.
  116. //Mobiles will only ever want 4 columns maximum, so the predefined templates are a small tradeoff
  117. private void SelectListViewTemplate(DataGridViewModelItem item)
  118. {
  119. var template = new DataTemplate();
  120. if (item.Image == null)
  121. {
  122. switch (item.Data.Count)
  123. {
  124. case 2:
  125. template = new DataTemplate(() =>
  126. {
  127. var cell = new ViewCell2Columns();
  128. cell.OnCellTapped += Row_Tapped;
  129. return cell;
  130. });
  131. break;
  132. case 3:
  133. template = new DataTemplate(() =>
  134. {
  135. var cell = new ViewCell3Columns();
  136. cell.OnCellTapped += Row_Tapped;
  137. return cell;
  138. });
  139. break;
  140. case 4:
  141. template = new DataTemplate(() =>
  142. {
  143. var cell = new ViewCell4Columns();
  144. cell.OnCellTapped += Row_Tapped;
  145. return cell;
  146. });
  147. break;
  148. }
  149. }
  150. else
  151. {
  152. switch (item.Data.Count)
  153. {
  154. case 2:
  155. template = new DataTemplate(() =>
  156. {
  157. var cell = new ViewCell2ColumnsWithImage();
  158. cell.OnCellTapped += Row_Tapped;
  159. cell.OnImageTapped += Image_Tapped;
  160. return cell;
  161. });
  162. break;
  163. case 3:
  164. template = new DataTemplate(() =>
  165. {
  166. var cell = new ViewCell3ColumnsWithImage();
  167. cell.OnCellTapped += Row_Tapped;
  168. cell.OnImageTapped += Image_Tapped;
  169. return cell;
  170. });
  171. break;
  172. case 4:
  173. template = new DataTemplate(() =>
  174. {
  175. var cell = new ViewCell4ColumnsWithImage();
  176. cell.OnCellTapped += Row_Tapped;
  177. cell.OnImageTapped += Image_Tapped;
  178. return cell;
  179. });
  180. break;
  181. }
  182. }
  183. itemsListView.ItemTemplate = template;
  184. }
  185. public int GenerateHeaders(DataGridViewModelItem item)
  186. {
  187. int count = 0;
  188. foreach (var tuple in item.Data)
  189. {
  190. CreateNewHeader(tuple.Item1, count);
  191. CreateFilterOption(count);
  192. count++;
  193. }
  194. return count;
  195. }
  196. private void GenerateImageHeader(DataGridViewModelItem item, int count)
  197. {
  198. if (item.Image != null)
  199. {
  200. headerGrid.ColumnDefinitions.Add(new ColumnDefinition { Width = new GridLength(1, GridUnitType.Star) });
  201. DataGridHeaderRow header = new DataGridHeaderRow { ColumnName = "Img", ColumnNumber = count };
  202. header.Setup();
  203. headerGrid.Children.Add(SetGridValues(header, 0, count));
  204. CreateSearchEntry("Img", count);
  205. }
  206. }
  207. private void CreateNewHeader(string name, int count)
  208. {
  209. headerGrid.ColumnDefinitions.Add(new ColumnDefinition { Width = new GridLength(1, GridUnitType.Star) });
  210. DataGridHeaderRow header = new DataGridHeaderRow { ColumnName = name, ColumnNumber = count };
  211. header.Setup();
  212. header.OnDataGridHeaderFilterTapped += Header_OnDataGridHeaderFilterTapped;
  213. header.OnDataGridHeaderTapped += Header_OnDataGridHeaderTapped;
  214. headerGrid.Children.Add(SetGridValues(header, 0, count));
  215. CreateSearchEntry(name, count);
  216. }
  217. private void CreateFilterOption(int column)
  218. {
  219. List<string> options = new List<string>();
  220. foreach (var property in info)
  221. {
  222. if (property.Name == "Col" + column)
  223. foreach (var item in Items)
  224. {
  225. string value = GetStringValue(property, item);
  226. if (!options.Contains(value) && !string.IsNullOrWhiteSpace(value))
  227. options.Add(value);
  228. }
  229. }
  230. options.Sort();
  231. FilterOptions.Add("Col" + column, options);
  232. }
  233. private void CreateSearchEntry(string name, int count)
  234. {
  235. var searchEnt = new DataGridSearchEntry(name, count);
  236. searchEnt.OnDataGridSearchEntryChanged += SearchEnt_OnDataGridSearchEntryChanged;
  237. searchEnt.IsEnabled = name == "Img" ? false : true;
  238. headerGrid.Children.Add(SetGridValues(searchEnt, 1, count));
  239. }
  240. private View SetGridValues(View view, int row, int column)
  241. {
  242. view.SetValue(Grid.RowProperty, row);
  243. view.SetValue(Grid.ColumnProperty, column);
  244. return view;
  245. }
  246. #endregion
  247. #region Events
  248. /// <summary>
  249. /// Depending on the selection mode of the supplied entity grid, tap will do different things
  250. /// - Does not apply to images
  251. /// - Multi select mode adds to selection (or removes it if already selected)
  252. /// - Single select mode adds to selection (or removes it if already selected), removes any other selected items
  253. /// - None does not select or deselect
  254. ///
  255. /// - NOTE that Item Selected event can return an object - e.g. a view to be displayed in a popup (since grids don't have access to popups)
  256. /// - This allows different selection reactions to be defined at the grid level, or even different reactions for the same grid depending on where it is called from
  257. /// - Add to the ProcessReturnObj() method to define specific reactions to each object
  258. /// </summary>
  259. /// <param name="sender"></param>
  260. /// <param name="e"></param>
  261. private void Row_Tapped(object sender, EventArgs e)
  262. {
  263. var item = itemsListView.SelectedItem as DataGridViewModelItem;
  264. if (item == null)
  265. return;
  266. if (SaveType == DataGridSaveType.Single || SaveType == DataGridSaveType.Multiple)
  267. {
  268. switch (SaveType)
  269. {
  270. case DataGridSaveType.Single:
  271. AddSelectionToLists(item);
  272. UnselectOthers(item);
  273. break;
  274. case DataGridSaveType.Multiple:
  275. AddSelectionToLists(item);
  276. break;
  277. }
  278. List<DataGridViewModelItem> list = new List<DataGridViewModelItem>();
  279. foreach (var i in CurrentItems)
  280. list.Add(i);
  281. Refresh(list);
  282. }
  283. var obj = OnItemSelected?.Invoke(item);
  284. ProcessReturnObj(obj, item);
  285. }
  286. private void ProcessReturnObj(object obj, DataGridViewModelItem item)
  287. {
  288. if (obj == null)
  289. return;
  290. if (obj is View)
  291. {
  292. popupLayout.PopupView.ContentTemplate = new DataTemplate(() =>
  293. {
  294. return obj;
  295. });
  296. Device.BeginInvokeOnMainThread(() => { popupLayout.Show(); });
  297. }
  298. }
  299. private void UnselectOthers(DataGridViewModelItem item)
  300. {
  301. UnselectItems(item, Items);
  302. UnselectItems(item, CurrentItems);
  303. }
  304. private void Image_Tapped(object sender, EventArgs e)
  305. {
  306. var item = ((TappedEventArgs)e).Parameter as DataGridViewModelItem;
  307. if (item == null)
  308. return;
  309. if (item.ImageID != Guid.Empty)
  310. {
  311. CoreTable table = new Client<Document>().Query(new Filter<Document>(x => x.ID).IsEqualTo(item.ImageID),
  312. new Columns<Document>(x => x.Data));
  313. CoreRow docrow = table.Rows.FirstOrDefault();
  314. if (docrow != null)
  315. {
  316. byte[] data = docrow.Get<Document, byte[]>(x => x.Data);
  317. ImageSource src = ImageSource.FromStream(() => new MemoryStream(data));
  318. if (src != null)
  319. {
  320. Image popupContent = new Image();
  321. popupContent.HorizontalOptions = LayoutOptions.FillAndExpand;
  322. popupContent.VerticalOptions = LayoutOptions.FillAndExpand;
  323. popupContent.Aspect = Aspect.AspectFit;
  324. popupContent.Source = src;
  325. popupLayout.PopupView.ContentTemplate = new DataTemplate(() =>
  326. {
  327. return popupContent;
  328. });
  329. Device.BeginInvokeOnMainThread(() => { popupLayout.Show(); });
  330. }
  331. }
  332. }
  333. else
  334. {
  335. var obj = OnImageSelected?.Invoke(item);
  336. ProcessReturnObj(obj, item);
  337. }
  338. }
  339. private void UnselectItems(DataGridViewModelItem item, List<DataGridViewModelItem> selectedlist)
  340. {
  341. var list = selectedlist.Where(x => x.IsSelected == true);
  342. foreach (var foundItem in list)
  343. {
  344. if (foundItem.ID != item.ID)
  345. foundItem.IsSelected = false;
  346. }
  347. }
  348. private void AddSelectionToLists(DataGridViewModelItem item)
  349. {
  350. bool selected = item.IsSelected;
  351. AddSelectionToList(selected, Items, item.ID);
  352. AddSelectionToList(selected, CurrentItems, item.ID);
  353. }
  354. private void AddSelectionToList(bool selected, List<DataGridViewModelItem> list, Guid ID)
  355. {
  356. var foundItem = list.FirstOrDefault(x => x.ID == ID);
  357. if (foundItem != null)
  358. foundItem.IsSelected = selected ? false : true;
  359. }
  360. private void SearchEnt_OnDataGridSearchEntryChanged(int columnnumber, string value, string colname)
  361. {
  362. if (string.IsNullOrWhiteSpace(value))
  363. Filters.Remove(Filters.FirstOrDefault(x => x.ColNumber == "Col" + columnnumber && x.FilterType == FilterType.Typed));
  364. else
  365. {
  366. if (Filters.FirstOrDefault(x => x.ColNumber == "Col" + columnnumber) != null)
  367. Filters.Remove(Filters.FirstOrDefault(x => x.ColNumber == "Col" + columnnumber && x.FilterType == FilterType.Typed));
  368. Filters.Add(new DataGridFilter(colname, "Col" + columnnumber, value, FindNumber(columnnumber), FilterType.Typed));
  369. }
  370. }
  371. private void Filters_CollectionChanged(object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e)
  372. {
  373. UpdateScreenOnFilter();
  374. }
  375. public void UpdateScreenOnFilter()
  376. {
  377. if (bSearching)
  378. return;
  379. CheckFilterDisplay();
  380. bSearching = true;
  381. List<DataGridViewModelItem> finalList = new List<DataGridViewModelItem>();
  382. if (Filters.FirstOrDefault(x => x.FilterNumber == FilterNumber.Zero) != null)
  383. {
  384. var foundfilters = Filters.Where(x => x.FilterNumber == FilterNumber.Zero);
  385. foreach (var foundfilter in foundfilters)
  386. {
  387. foreach (DataGridViewModelItem item in RunSearch(Items, foundfilter.Value, "Col0"))
  388. finalList.Add(item);
  389. }
  390. }
  391. else
  392. {
  393. foreach (DataGridViewModelItem item in Items)
  394. finalList.Add(item);
  395. }
  396. if (Filters.FirstOrDefault(x => x.FilterNumber == FilterNumber.One) != null)
  397. {
  398. var foundfilters = Filters.Where(x => x.FilterNumber == FilterNumber.One);
  399. List<DataGridViewModelItem> intermediatelist = new List<DataGridViewModelItem>();
  400. foreach (var foundfilter in foundfilters)
  401. {
  402. foreach (DataGridViewModelItem item in RunSearch(finalList, foundfilter.Value, "Col1"))
  403. intermediatelist.Add(item);
  404. }
  405. finalList.Clear();
  406. foreach (DataGridViewModelItem item in intermediatelist)
  407. finalList.Add(item);
  408. }
  409. else if (finalList.Count == 0)
  410. {
  411. foreach (DataGridViewModelItem item in Items)
  412. finalList.Add(item);
  413. }
  414. if (Filters.FirstOrDefault(x => x.FilterNumber == FilterNumber.Two) != null)
  415. {
  416. var foundfilters = Filters.Where(x => x.FilterNumber == FilterNumber.Two);
  417. List<DataGridViewModelItem> intermediatelist = new List<DataGridViewModelItem>();
  418. foreach (var foundfilter in foundfilters)
  419. {
  420. foreach (DataGridViewModelItem item in RunSearch(finalList, foundfilter.Value, "Col2"))
  421. intermediatelist.Add(item);
  422. }
  423. finalList.Clear();
  424. foreach (DataGridViewModelItem item in intermediatelist)
  425. finalList.Add(item);
  426. }
  427. else if (finalList.Count == 0)
  428. {
  429. foreach (DataGridViewModelItem item in Items)
  430. finalList.Add(item);
  431. }
  432. if (Filters.FirstOrDefault(x => x.FilterNumber == FilterNumber.Three) != null)
  433. {
  434. var foundfilters = Filters.Where(x => x.FilterNumber == FilterNumber.Three);
  435. List<DataGridViewModelItem> intermediatelist = new List<DataGridViewModelItem>();
  436. foreach (var foundfilter in foundfilters)
  437. {
  438. foreach (DataGridViewModelItem item in RunSearch(finalList, foundfilter.Value, "Col3"))
  439. intermediatelist.Add(item);
  440. }
  441. finalList.Clear();
  442. foreach (DataGridViewModelItem item in intermediatelist)
  443. finalList.Add(item);
  444. }
  445. if (finalList.Count == 0 && Filters.Count == 0)
  446. {
  447. foreach (DataGridViewModelItem item in Items)
  448. finalList.Add(item);
  449. }
  450. else if (finalList.Count == Items.Count && Filters.Count > 0)
  451. finalList.Clear();
  452. Refresh(finalList);
  453. bSearching = false;
  454. }
  455. private void CheckFilterDisplay()
  456. {
  457. filterLayout.Children.Clear();
  458. foreach (var filter in Filters)
  459. {
  460. DataGridFilterView filterview = new DataGridFilterView(filter.DisplayValue, filter.FilterType, filter.ColNumber);
  461. filterview.OnFilterClosed += Filterview_OnFilterClosed;
  462. filterLayout.Children.Add(filterview);
  463. }
  464. }
  465. private void Filterview_OnFilterClosed(string value, FilterType type, string colnumber)
  466. {
  467. List<DataGridFilter> toRemove = new List<DataGridFilter>();
  468. foreach (var child in filterLayout.Children)
  469. {
  470. if (child.GetType() == typeof(DataGridFilterView))
  471. {
  472. if ((child as DataGridFilterView).Value == value && (child as DataGridFilterView).FilterType == type)
  473. {
  474. var filter = Filters.FirstOrDefault(x => x.DisplayValue == value && x.FilterType == type);
  475. if (filter != null)
  476. toRemove.Add(filter);
  477. }
  478. }
  479. }
  480. if (toRemove.First().FilterType == FilterType.Typed)
  481. {
  482. foreach (var child in headerGrid.Children)
  483. {
  484. if (child.GetType() == typeof(DataGridSearchEntry))
  485. {
  486. if ((child as DataGridSearchEntry).ColumnNumber == int.Parse(colnumber.Substring(3, 1)))
  487. (child as DataGridSearchEntry).Text = "";
  488. }
  489. }
  490. }
  491. Filters.Remove(toRemove.First());
  492. }
  493. private void Header_OnDataGridHeaderTapped(int columnnumber, SearchUtils.SortDirection sortdirection)
  494. {
  495. var intermediatelist = new List<DataGridViewModelItem>();
  496. foreach (var property in info)
  497. {
  498. if (property.Name == "Col" + columnnumber)
  499. {
  500. foreach (var item in SearchUtils.OrderByPropertyName(CurrentItems, "Col" + columnnumber, sortdirection))
  501. {
  502. intermediatelist.Add(item);
  503. }
  504. Refresh(intermediatelist);
  505. }
  506. }
  507. }
  508. private void Header_OnDataGridHeaderFilterTapped(int columnnumber, string columnname)
  509. {
  510. List<string> options = FilterOptions["Col" + columnnumber];
  511. List<DataGridFilter> filters = new List<DataGridFilter>();
  512. var selectedFilters = Filters.Where(x => x.FilterType == FilterType.Selected && x.ColNumber == "Col" + columnnumber);
  513. foreach (var list in selectedFilters)
  514. {
  515. filters.Add(list);
  516. }
  517. MultiSelectPage filterpage = new MultiSelectPage(options, filters, columnnumber, columnname);
  518. filterpage.OnPageSaved += FilterPage_OnPageSaved;
  519. Navigation.PushAsync(filterpage);
  520. }
  521. private void FilterPage_OnPageSaved(IEnumerable<MultiSelectPageViewItem> items, int columnnumber, string columnname)
  522. {
  523. var intermediateList = new List<DataGridFilter>();
  524. var list = Filters.Where(x => x.ColNumber == "Col" + columnnumber && x.FilterType == FilterType.Selected);
  525. foreach (var item in list)
  526. {
  527. intermediateList.Add(item);
  528. }
  529. foreach (var filter in intermediateList)
  530. Filters.Remove(filter);
  531. foreach (var item in items)
  532. Filters.Add(new DataGridFilter(columnname, "Col" + columnnumber, item.Value, FindNumber(columnnumber), FilterType.Selected));
  533. var newlist = Filters.Where(x => x.ColNumber == "Col" + columnnumber);
  534. }
  535. #endregion
  536. #region Utils
  537. private IEnumerable<DataGridViewModelItem> RunSearch(IEnumerable<DataGridViewModelItem> list, string value, string propertyname)
  538. {
  539. var intermediatelist = new List<DataGridViewModelItem>();
  540. foreach (var property in info)
  541. {
  542. if (property.Name == propertyname)
  543. {
  544. foreach (var item in list)
  545. {
  546. if (GetStringValue(property, item).Contains(value)
  547. || GetStringValue(property, item).Contains(value.ToUpper())
  548. || GetStringValue(property, item).Contains(value.ToLower())
  549. || GetStringValue(property, item).Contains(SearchUtils.LowerCaseFirst(value))
  550. || GetStringValue(property, item).Contains(SearchUtils.UpperCaseFirst(value))
  551. || GetStringValue(property, item).Contains(SearchUtils.UpperCaseSecond(value))
  552. )
  553. {
  554. if (!intermediatelist.Contains(item))
  555. intermediatelist.Add(item);
  556. }
  557. }
  558. }
  559. }
  560. return intermediatelist;
  561. }
  562. private void ChangeHeaderColour(bool filterpresent, int colnumber)
  563. {
  564. foreach (var header in headerGrid.Children)
  565. {
  566. if (header.GetType() == typeof(DataGridHeaderRow))
  567. {
  568. if ((header as DataGridHeaderRow).ColumnNumber == colnumber)
  569. (header as DataGridHeaderRow).ChangeFilterColour(filterpresent);
  570. }
  571. }
  572. }
  573. private string GetStringValue(PropertyInfo property, object item)
  574. {
  575. if (property.PropertyType == typeof(string))
  576. return (string)property.GetValue(item);
  577. else
  578. return "";
  579. }
  580. private FilterNumber FindNumber(int columnnumber)
  581. {
  582. switch (columnnumber)
  583. {
  584. case 0:
  585. return FilterNumber.Zero;
  586. case 1:
  587. return FilterNumber.One;
  588. case 2:
  589. return FilterNumber.Two;
  590. case 3:
  591. return FilterNumber.Three;
  592. default:
  593. return FilterNumber.Zero;
  594. }
  595. }
  596. #endregion
  597. }
  598. public enum FilterNumber
  599. {
  600. Zero,
  601. One,
  602. Two,
  603. Three
  604. }
  605. public enum FilterType
  606. {
  607. Typed,
  608. Selected
  609. }
  610. public class DataGridFilter
  611. {
  612. public string ColNumber { get; set; }
  613. public string ColName { get; set; }
  614. public string Value { get; set; }
  615. public FilterNumber FilterNumber { get; set; }
  616. public FilterType FilterType { get; set; }
  617. public string DisplayValue
  618. {
  619. get => ColName + " = " + Value;
  620. }
  621. public DataGridFilter(string colname, string colNumber, string value, FilterNumber filterNumber, FilterType filterType)
  622. {
  623. ColName = colname;
  624. ColNumber = colNumber;
  625. Value = value;
  626. FilterNumber = filterNumber;
  627. FilterType = filterType;
  628. }
  629. }
  630. public class DataGridViewModelItem
  631. {
  632. public Guid ID { get; set; }
  633. public Guid ImageID { get; set; }
  634. private bool isSelected;
  635. public bool IsSelected
  636. {
  637. get
  638. {
  639. return isSelected;
  640. }
  641. set
  642. {
  643. isSelected = value;
  644. Color = isSelected == true ? Color.FromHex("#91a3b0") /*Cadet Gray*/ : Color.Default;
  645. }
  646. }
  647. public Color Color { get; set; }
  648. public List<Tuple<string, string>> Data { get; set; }
  649. public string Col0 { get; set; }
  650. public string Col1 { get; set; }
  651. public string Col2 { get; set; }
  652. public string Col3 { get; set; }
  653. public Image Image { get; set; }
  654. public ImageSource Source
  655. {
  656. get
  657. {
  658. return Image == null ? null : Image.Source;
  659. }
  660. }
  661. public Dictionary<string, string> ImagePopupDetail { get; set; }
  662. public GridLength ColWidth0 { get; set; }
  663. public GridLength ColWidth1 { get; set; }
  664. public GridLength ColWidth2 { get; set; }
  665. public GridLength ColWidth3 { get; set; }
  666. public GridLength ImageColWidth { get; set; }
  667. public string PopUpDetail { get; set; }
  668. public DateTime SortDate { get; set; }
  669. public int SortInt { get; set; }
  670. public double SortDouble { get; set; }
  671. public DataGridViewModelItem(Guid id, List<Tuple<string, string>> data, Image image = null, Guid imageid = new Guid(), string popupdetail = "", Dictionary<string, string> imagePopupDetail = null)
  672. {
  673. ID = id;
  674. ImageID = imageid;
  675. Data = data;
  676. Image = image;
  677. Col0 = data.Count > 0 ? data[0].Item2 : "";
  678. Col1 = data.Count > 1 ? data[1].Item2 : "";
  679. Col2 = data.Count > 2 ? data[2].Item2 : "";
  680. Col3 = data.Count > 3 ? data[3].Item2 : "";
  681. ImageColWidth = image != null ? new GridLength(0.5, GridUnitType.Star) : new GridLength(0, GridUnitType.Auto);
  682. ColWidth0 = data.Count > 0 ? new GridLength(1, GridUnitType.Star) : new GridLength(0, GridUnitType.Auto);
  683. ColWidth1 = data.Count > 1 ? new GridLength(1, GridUnitType.Star) : new GridLength(0, GridUnitType.Auto);
  684. ColWidth2 = data.Count > 2 ? new GridLength(1, GridUnitType.Star) : new GridLength(0, GridUnitType.Auto);
  685. ColWidth3 = data.Count > 3 ? new GridLength(1, GridUnitType.Star) : new GridLength(0, GridUnitType.Auto);
  686. IsSelected = false;
  687. PopUpDetail = popupdetail;
  688. SortDate = DateTime.MinValue;
  689. SortInt = 0;
  690. ImagePopupDetail = imagePopupDetail != null? imagePopupDetail : new Dictionary<string, string>();
  691. }
  692. }
  693. }