瀏覽代碼

DYNAMIC GRID - visual filter improvements

Nick-PRSDigital@bitbucket.org 2 年之前
父節點
當前提交
dced78d745

+ 2 - 1
inabox.wpf/DynamicGrid/BaseDynamicGrid.cs

@@ -9,6 +9,7 @@ using System.Windows.Media;
 using System.Windows.Media.Imaging;
 using FastReport.Editor;
 using InABox.Core;
+using Syncfusion.Data;
 using Selection = InABox.Core.Selection;
 
 namespace InABox.DynamicGrid
@@ -118,7 +119,7 @@ namespace InABox.DynamicGrid
 
         public abstract CoreRow[] SelectedRows { get; set; }
 
-        public abstract void AddVisualFilter(string column, string value);
+        public abstract void AddVisualFilter(string column, string value, FilterType filtertype = FilterType.Contains);
 
         public abstract Button AddButton(string caption, BitmapImage? image, string? tooltip, Func<Button, CoreRow[], bool> action,
             DynamicGridButtonPosition position = DynamicGridButtonPosition.Left);

+ 106 - 104
inabox.wpf/DynamicGrid/DynamicGrid.cs

@@ -94,7 +94,7 @@ namespace InABox.DynamicGrid
 
         private void CalculateAggregate(IEnumerable items, string property, PropertyDescriptor args)
         {
-            if(items is IEnumerable<DataRowView> rows)
+            if (items is IEnumerable<DataRowView> rows)
             {
                 if (string.Equals(args.Name, "Count"))
                 {
@@ -177,7 +177,7 @@ namespace InABox.DynamicGrid
 
         public override DependencyProperty ForegroundProperty => Control.ForegroundProperty;
     }
-    
+
     public class DynamicGridCellStyle : DynamicGridStyle<Control>
     {
         public DynamicGridCellStyle() : base(null)
@@ -247,11 +247,11 @@ namespace InABox.DynamicGrid
         }
     }
 
-// Used to render boolean columns (the default "false" value shows what appears to be an intermediate state, which is ugly
-// This should show nothing for false, and a tick in a box for true
+    // Used to render boolean columns (the default "false" value shows what appears to be an intermediate state, which is ugly
+    // This should show nothing for false, and a tick in a box for true
     public class BoolToImageConverter : IValueConverter
     {
-        private static readonly BitmapImage tick =Wpf.Resources.Bullet_Tick.AsBitmapImage();
+        private static readonly BitmapImage tick = Wpf.Resources.Bullet_Tick.AsBitmapImage();
 
         public object? Convert(object value, Type targetType, object parameter, CultureInfo culture)
         {
@@ -306,7 +306,7 @@ namespace InABox.DynamicGrid
     {
         object? IValueConverter.Convert(object value, Type targetType, object parameter, CultureInfo culture)
         {
-            if(value is string[] strArray)
+            if (value is string[] strArray)
             {
                 return string.Join("\n", strArray);
             }
@@ -374,9 +374,9 @@ namespace InABox.DynamicGrid
 
         private readonly Grid Layout;
         private readonly Label Loading;
-        
+
         private DoubleAnimation LoadingFader = new DoubleAnimation(1d, 0.2d, new Duration(TimeSpan.FromSeconds(2))) { AutoReverse = true };
-        
+
         protected Dictionary<string, CoreTable> Lookups = new();
         //private readonly Button MultiEdit;
         private readonly Button Paste;
@@ -393,7 +393,7 @@ namespace InABox.DynamicGrid
 
         #region Events
 
-        public event SelectItemHandler? OnSelectItem;       
+        public event SelectItemHandler? OnSelectItem;
 
         public event OnCellDoubleClick? OnCellDoubleClick;
 
@@ -413,9 +413,9 @@ namespace InABox.DynamicGrid
 
         public override event EntitySaveEvent? OnBeforeSave;
         public override event EntitySaveEvent? OnAfterSave;
-        
+
         #endregion
-        
+
         private DynamicGridCellStyleConverter<System.Windows.Media.Brush?> CellBackgroundConverter;
         private DynamicGridCellStyleConverter<System.Windows.Media.Brush?> CellForegroundConverter;
         private DynamicGridCellStyleConverter<double?> CellFontSizeConverter;
@@ -427,9 +427,9 @@ namespace InABox.DynamicGrid
         protected virtual double? GetCellFontSize(CoreRow row, String columnname) => null;
         protected virtual FontStyle? GetCellFontStyle(CoreRow row, String columnname) => null;
         protected virtual FontWeight? GetCellFontWeight(CoreRow row, String columnname) => null;
-        
 
-        
+
+
         public DynamicGrid() : base()
         {
             IsReady = false;
@@ -445,7 +445,7 @@ namespace InABox.DynamicGrid
             MasterColumns = new DynamicGridColumns();
             MasterColumns.ExtractColumns(typeof(T));
 
-            foreach(var column in LookupFactory.RequiredColumns<T>().ColumnNames())
+            foreach (var column in LookupFactory.RequiredColumns<T>().ColumnNames())
             {
                 AddHiddenColumn(column);
             }
@@ -460,7 +460,7 @@ namespace InABox.DynamicGrid
                 ActionColumns.Add(down);
                 HiddenColumns.Add(x => (x as ISequenceable)!.Sequence);
             }
-            
+
             CellBackgroundConverter = new DynamicGridCellStyleConverter<System.Windows.Media.Brush?>(this, GetCellBackground);
             CellForegroundConverter = new DynamicGridCellStyleConverter<System.Windows.Media.Brush?>(this, GetCellForeground);
             CellFontSizeConverter = new DynamicGridCellStyleConverter<double?>(this, GetCellFontSize);
@@ -497,7 +497,7 @@ namespace InABox.DynamicGrid
             DataGrid.ColumnSizer = GridLengthUnitType.AutoLastColumnFill;
             DataGrid.SelectionForegroundBrush = BaseDynamicGrid.SelectionForeground;
             DataGrid.RowSelectionBrush = BaseDynamicGrid.SelectionBackground;
-            
+
             DataGrid.CurrentCellBorderThickness = new Thickness(0);
             DataGrid.AllowFiltering = false;
             DataGrid.EnableDataVirtualization = true;
@@ -552,11 +552,11 @@ namespace InABox.DynamicGrid
                     Loading.BeginAnimation(Label.OpacityProperty, LoadingFader);
                 }
             };
-            
+
             Help = CreateButton(Wpf.Resources.help.AsBitmapImage(Color.White));
             Help.Margin = new Thickness(0, 2, 2, 0);
             Help.SetValue(DockPanel.DockProperty, Dock.Right);
-            Help.Click += (o, e) => ShowHelp(typeof(T).Name.Split('.').Last().SplitCamelCase().Replace(" ","_"));
+            Help.Click += (o, e) => ShowHelp(typeof(T).Name.Split('.').Last().SplitCamelCase().Replace(" ", "_"));
 
             Add = CreateButton(Wpf.Resources.add.AsBitmapImage(Color.White));
             Add.Margin = new Thickness(0, 2, 2, 0);
@@ -619,7 +619,7 @@ namespace InABox.DynamicGrid
             LeftButtonStack.Children.Add(Export);
             LeftButtonStack.Children.Add(Import);
             LeftButtonStack.Children.Add(ExportSpacer);
-            
+
             RightButtonStack = new StackPanel();
             RightButtonStack.Orientation = Orientation.Horizontal;
             RightButtonStack.SetValue(DockPanel.DockProperty, Dock.Right);
@@ -629,7 +629,7 @@ namespace InABox.DynamicGrid
             Delete.SetValue(DockPanel.DockProperty, Dock.Right);
             Delete.Click += Delete_Click;
 
-            DuplicateBtn = AddButton("Duplicate",Wpf.Resources.paste.AsBitmapImage(Color.White), DoDuplicate);
+            DuplicateBtn = AddButton("Duplicate", Wpf.Resources.paste.AsBitmapImage(Color.White), DoDuplicate);
 
             Count = new Label();
             Count.Height = 30;
@@ -674,7 +674,7 @@ namespace InABox.DynamicGrid
                 if (_header is not null && Layout.Children.Contains(_header))
                     Layout.Children.Remove(_header);
                 _header = value;
-                if(_header is not null)
+                if (_header is not null)
                 {
                     _header.SetValue(Grid.RowProperty, 0);
                     _header.SetValue(Grid.ColumnProperty, 0);
@@ -712,7 +712,7 @@ namespace InABox.DynamicGrid
 
             Add.Visibility = Options.Contains(DynamicGridOption.AddRows) ? Visibility.Visible : Visibility.Collapsed;
             Edit.Visibility = Options.Contains(DynamicGridOption.EditRows) ? Visibility.Visible : Visibility.Collapsed;
-            
+
             EditSpacer.Visibility = Options.Contains(DynamicGridOption.AddRows) || Options.Contains(DynamicGridOption.EditRows)
                 ? Visibility.Visible
                 : Visibility.Collapsed;
@@ -745,7 +745,7 @@ namespace InABox.DynamicGrid
                 DataGrid.AllowDraggingRows = true;
                 DataGrid.RowDragDropController.DragStart += RowDragDropController_DragStart;
             }
-            else if(DataGrid.AllowDraggingRows)
+            else if (DataGrid.AllowDraggingRows)
             {
                 DataGrid.AllowDraggingRows = false;
                 DataGrid.RowDragDropController.DragStart -= RowDragDropController_DragStart;
@@ -775,7 +775,7 @@ namespace InABox.DynamicGrid
         {
             return new DynamicGridRowStyleSelector<T, DynamicGridRowStyle>();
         }
-        
+
         protected override DynamicGridStyle GetRowStyle(CoreRow row, DynamicGridStyle style)
         {
             var result = base.GetRowStyle(row, style);
@@ -864,7 +864,7 @@ namespace InABox.DynamicGrid
             var column = ColumnList[col] as DynamicActionColumn;
             if (column != null)
                 e.ItemsSource = column.Filters.Select(x => new FilterElement
-                    { DisplayText = x, ActualValue = x, IsSelected = column.SelectedFilters == null || column.SelectedFilters.Contains(x) });
+                { DisplayText = x, ActualValue = x, IsSelected = column.SelectedFilters == null || column.SelectedFilters.Contains(x) });
         }
 
         private CoreRow? GetRowFromIndex(int rowIndex)
@@ -972,7 +972,7 @@ namespace InABox.DynamicGrid
                 return;
             if (e.Column is GridCheckBoxColumn)
                 inplaceeditor = LoadItem(Data.Rows[e.RowColumnIndex.RowIndex - headerrows]);
-            if(inplaceeditor is not null)
+            if (inplaceeditor is not null)
                 UpdateData(inplaceeditor, e.RowColumnIndex.ColumnIndex);
             if (e.Column is GridCheckBoxColumn)
                 inplaceeditor = null;
@@ -1010,7 +1010,7 @@ namespace InABox.DynamicGrid
                 return;
             if (inplaceeditor is not null && bChanged) UpdateData(inplaceeditor, e.RowColumnIndex.ColumnIndex);
             bChanged = false;
-            inplaceeditor = null; 
+            inplaceeditor = null;
             DataGridItems.AcceptChanges();
         }
 
@@ -1034,8 +1034,8 @@ namespace InABox.DynamicGrid
             if (DataGrid.Columns[colname] is GridComboBoxColumn combo)
             {
 
-                var prefix = String.Join(".",corecol.Split(".").Reverse().Skip(1).Reverse());
-                var field = corecol.Split(".").Last();             
+                var prefix = String.Join(".", corecol.Split(".").Reverse().Skip(1).Reverse());
+                var field = corecol.Split(".").Last();
                 var lookups = (combo.ItemsSource as DataView)?.Table;
                 if (lookups != null)
                 {
@@ -1044,8 +1044,8 @@ namespace InABox.DynamicGrid
                     {
                         foreach (DataColumn lookupcol in lookups.Columns)
                         {
-                            var prop = String.IsNullOrWhiteSpace(prefix) 
-                                ? lookupcol.ColumnName 
+                            var prop = String.IsNullOrWhiteSpace(prefix)
+                                ? lookupcol.ColumnName
                                 : String.Join(".", new String[] { prefix, lookupcol.ColumnName });
                             DynamicGridUtils.UpdateEditorValue(new BaseObject[] { inplaceeditor }, prop, lookuprow[lookupcol], changes);
                             //CoreUtils.SetPropertyValue(obj, prop, lookuprow[lookupcol]);
@@ -1055,7 +1055,7 @@ namespace InABox.DynamicGrid
             }
             else
                 DynamicGridUtils.UpdateEditorValue(new BaseObject[] { inplaceeditor }, corecol, value, changes);
-                //CoreUtils.SetPropertyValue(obj, corecol, value);
+            //CoreUtils.SetPropertyValue(obj, corecol, value);
 
 
             SaveItem(obj);
@@ -1069,9 +1069,9 @@ namespace InABox.DynamicGrid
                 row[scol] = corerow[column.ColumnName] ?? DBNull.Value;
             }
 
-            for (var i = 0; i < ActionColumns.Count; i++) 
+            for (var i = 0; i < ActionColumns.Count; i++)
                 row[string.Format("ActionColumn{0}", i)] = ActionColumns[i].Data(corerow);
-            
+
         }
 
         private void DataGrid_QueryRowHeight(object? sender, QueryRowHeightEventArgs e)
@@ -1341,7 +1341,7 @@ namespace InABox.DynamicGrid
         {
             StopTimer();
 
-            if(OnCellDoubleClick is not null && ColumnList[e.RowColumnIndex.ColumnIndex] is DynamicGridColumn column)
+            if (OnCellDoubleClick is not null && ColumnList[e.RowColumnIndex.ColumnIndex] is DynamicGridColumn column)
             {
                 var row = GetRowFromIndex(e.RowColumnIndex.RowIndex);
                 var args = new DynamicGridCellClickEventArgs(row, column);
@@ -1419,8 +1419,8 @@ namespace InABox.DynamicGrid
             var fAvailWidth = width;
 
             //if (Data.Rows.Count * (DataGrid.RowHeight + 1) + DataGrid.HeaderRowHeight > height + 0.5F)
-            if(height < DataGrid.AutoScroller.VScrollBar.Maximum)
-                fAvailWidth -= (SystemParameters.VerticalScrollBarWidth+0.75);
+            if (height < DataGrid.AutoScroller.VScrollBar.Maximum)
+                fAvailWidth -= (SystemParameters.VerticalScrollBarWidth + 0.75);
 
 
             double fCurWidth = 0.0F;
@@ -1477,7 +1477,7 @@ namespace InABox.DynamicGrid
                     //String sColName = String.Format("ActionColumn{0}{1}", i, position == DynamicActionColumnPosition.Start ? "L" : "R");
                     var sColName = string.Format("ActionColumn{0}", i);
                     gridRowResizingOptions.ExcludeColumns.Add(sColName);
-                    
+
                     if (column is DynamicImageColumn imgcol)
                     {
                         var newcol = new GridImageColumn();
@@ -1490,16 +1490,16 @@ namespace InABox.DynamicGrid
                         newcol.ColumnSizer = GridLengthUnitType.None;
                         newcol.HeaderText = column.HeaderText;
                         newcol.AllowSorting = false;
-                        
+
                         ApplyFilterStyle(newcol, true, true);
-                        
+
                         newcol.ShowToolTip = column.ToolTip != null;
-                        
+
                         var style = new Style();
                         style.Setters.Add(new Setter(BackgroundProperty, new SolidColorBrush(Colors.Gainsboro)));
                         style.Setters.Add(new Setter(IsEnabledProperty, false));
                         newcol.FilterRowCellStyle = style;
-                        
+
                         var headstyle = new Style(typeof(GridHeaderCellControl));
                         headstyle.Setters.Add(new Setter(BackgroundProperty, new SolidColorBrush(Colors.Gainsboro)));
                         headstyle.Setters.Add(new Setter(ForegroundProperty, new SolidColorBrush(Colors.Black)));
@@ -1538,11 +1538,11 @@ namespace InABox.DynamicGrid
                     }
                     else if (column is DynamicTextColumn txtCol)
                     {
-                        
+
                         var newcol = new GridTextColumn();
                         gridRowResizingOptions.ExcludeColumns.Add(sColName);
                         newcol.TextWrapping = TextWrapping.NoWrap;
-                        
+
                         newcol.TextAlignment = txtCol.Alignment == Alignment.NotSet
                             ? TextAlignment.Left
                             : txtCol.Alignment == Alignment.BottomLeft || txtCol.Alignment == Alignment.MiddleLeft ||
@@ -1552,7 +1552,7 @@ namespace InABox.DynamicGrid
                                   txtCol.Alignment == Alignment.TopCenter
                                     ? TextAlignment.Center
                                     : TextAlignment.Right;
-                        
+
                         newcol.AllowEditing = false;
                         newcol.UpdateTrigger = UpdateSourceTrigger.PropertyChanged;
                         newcol.MappingName = sColName;
@@ -1563,12 +1563,12 @@ namespace InABox.DynamicGrid
                         newcol.AllowSorting = false;
                         newcol.FilterRowOptionsVisibility = Visibility.Collapsed;
                         newcol.ShowToolTip = column.ToolTip != null;
-                        
+
                         var style = new Style();
                         style.Setters.Add(new Setter(BackgroundProperty, new SolidColorBrush(Colors.Gainsboro)));
                         style.Setters.Add(new Setter(IsEnabledProperty, false));
                         newcol.FilterRowCellStyle = style;
-                        
+
                         var headstyle = new Style(typeof(GridHeaderCellControl));
                         headstyle.Setters.Add(new Setter(BackgroundProperty, new SolidColorBrush(Colors.Gainsboro)));
                         headstyle.Setters.Add(new Setter(ForegroundProperty, new SolidColorBrush(Colors.Black)));
@@ -1585,10 +1585,10 @@ namespace InABox.DynamicGrid
                         newcol.HeaderStyle = headstyle;
 
                         DataGrid.Columns.Add(newcol);
-                        ColumnList.Add(column);                        
+                        ColumnList.Add(column);
                     }
 
-                    
+
                 }
             }
         }
@@ -1597,7 +1597,7 @@ namespace InABox.DynamicGrid
         {
             return !IsSequenced;
         }
-        
+
         private void ReloadColumns()
         {
 
@@ -1617,7 +1617,7 @@ namespace InABox.DynamicGrid
             gridRowResizingOptions.ExcludeColumns = new List<string>();
 
             LoadActionColumns(DynamicActionColumnPosition.Start);
-            
+
             foreach (var column in VisibleColumns)
             {
                 var filtering = true;
@@ -1866,14 +1866,14 @@ namespace InABox.DynamicGrid
                     }
                     else
                     {
-                        cellstyle.Setters.Add(new Setter(BackgroundProperty, new Binding() { Path=new PropertyPath("."), Converter = CellBackgroundConverter, ConverterParameter = column.ColumnName}));
-                        cellstyle.Setters.Add(new Setter(ForegroundProperty, new Binding() { Converter = CellForegroundConverter, ConverterParameter = column.ColumnName}));
-                        cellstyle.Setters.Add(new Setter(FontSizeProperty, new Binding() { Converter = CellFontSizeConverter, ConverterParameter = column.ColumnName}));
-                        cellstyle.Setters.Add(new Setter(FontStyleProperty, new Binding() { Converter = CellFontStyleConverter, ConverterParameter = column.ColumnName}));
-                        cellstyle.Setters.Add(new Setter(FontWeightProperty, new Binding() { Converter = CellFontWeightConverter, ConverterParameter = column.ColumnName}));
+                        cellstyle.Setters.Add(new Setter(BackgroundProperty, new Binding() { Path = new PropertyPath("."), Converter = CellBackgroundConverter, ConverterParameter = column.ColumnName }));
+                        cellstyle.Setters.Add(new Setter(ForegroundProperty, new Binding() { Converter = CellForegroundConverter, ConverterParameter = column.ColumnName }));
+                        cellstyle.Setters.Add(new Setter(FontSizeProperty, new Binding() { Converter = CellFontSizeConverter, ConverterParameter = column.ColumnName }));
+                        cellstyle.Setters.Add(new Setter(FontStyleProperty, new Binding() { Converter = CellFontStyleConverter, ConverterParameter = column.ColumnName }));
+                        cellstyle.Setters.Add(new Setter(FontWeightProperty, new Binding() { Converter = CellFontWeightConverter, ConverterParameter = column.ColumnName }));
                         newcol.CellStyle = cellstyle;
                     }
-                    
+
 
                     DataGrid.Columns.Add(newcol);
                     ColumnList.Add(column);
@@ -1897,7 +1897,7 @@ namespace InABox.DynamicGrid
 
             DataGrid.Columns.Resume();
             DataGrid.RefreshColumns();
-            
+
             foreach (var key in _filterpredicates.Keys.ToArray())
                 if (DataGrid.Columns.Any(x => string.Equals(x.MappingName, key)))
                 {
@@ -1927,8 +1927,8 @@ namespace InABox.DynamicGrid
                 column.FilterRowCondition = FilterRowCondition.Contains;
                 column.FilterRowOptionsVisibility = Visibility.Collapsed;
                 column.AllowBlankFilters = true;
-                column.AllowSorting = isactioncolumn 
-                    ? false 
+                column.AllowSorting = isactioncolumn
+                    ? false
                     : CanSort();
             }
             else
@@ -1964,13 +1964,13 @@ namespace InABox.DynamicGrid
 
         public override void Refresh(bool reloadcolumns, bool reloaddata)
         {
-            
+
             if (bRefreshing)
                 return;
 
             if (!DoBeforeRefresh())
                 return;
-            
+
             DataGrid.SelectionForegroundBrush = BaseDynamicGrid.SelectionForeground;
             DataGrid.RowSelectionBrush = BaseDynamicGrid.SelectionBackground;
 
@@ -1978,7 +1978,7 @@ namespace InABox.DynamicGrid
 
             Loading.Visibility = Visibility.Visible;
             Loading.BeginAnimation(Label.OpacityProperty, LoadingFader);
-            
+
             bRefreshing = true;
 
             // Yo, please don't remove this.
@@ -1986,10 +1986,10 @@ namespace InABox.DynamicGrid
             // for no reason. I think perhaps the image columns were trying to refer to data that didn't exist anymore when calling DataGrid.Columns.Refresh(),
             // and thus some mega problems (perhaps even exceptions within Syncfusion) were occurring, and this seems to fix it.
             // I don't pretend to know why it works; this is probably the strangest problem I've ever come across.
-            if(reloadcolumns)
+            if (reloadcolumns)
                 DataGrid.ItemsSource = null;
-            
-            if (reloadcolumns) 
+
+            if (reloadcolumns)
                 ReloadColumns();
 
             if (reloaddata)
@@ -2018,7 +2018,7 @@ namespace InABox.DynamicGrid
                             Dispatcher.Invoke(() =>
                             {
                                 MessageBox.Show(String.Format("Error: {0}", exception.Message));
-                            });                                
+                            });
                         }
                         else if (table is not null)
                         {
@@ -2040,18 +2040,18 @@ namespace InABox.DynamicGrid
                 DoAfterRefresh();
                 bRefreshing = false;
                 IsReady = true;
-                
+
                 Loading.BeginAnimation(Label.OpacityProperty, null);
                 Loading.Visibility = Visibility.Collapsed;
             }
-            
+
             if (cursor != null)
             {
                 cursor.Dispose();
                 cursor = null;
             }
         }
-        
+
         protected override bool OnBeforeRefresh()
         {
             return true;
@@ -2069,7 +2069,7 @@ namespace InABox.DynamicGrid
 
             return result;
         }
-        
+
         protected override void OnAfterRefresh()
         {
         }
@@ -2079,7 +2079,7 @@ namespace InABox.DynamicGrid
             OnAfterRefresh();
             NotifyAfterRefresh(new AfterRefreshEventArgs());
         }
-        
+
         public Columns<T> DataColumns()
         {
             var columns = new Columns<T>();
@@ -2218,9 +2218,9 @@ namespace InABox.DynamicGrid
             }
 
             for (var i = 0; i < ActionColumns.Count; i++)
-                result.Columns.Add(string.Format("ActionColumn{0}", i), 
-                    ActionColumns[i] is DynamicImageColumn 
-                        ? typeof(BitmapImage) 
+                result.Columns.Add(string.Format("ActionColumn{0}", i),
+                    ActionColumns[i] is DynamicImageColumn
+                        ? typeof(BitmapImage)
                         : typeof(String)
                 );
 
@@ -2233,7 +2233,7 @@ namespace InABox.DynamicGrid
 
             if (RowStyleSelector != null)
                 RowStyleSelector.Data = Data;
-            
+
             //int rowIndex = DataGrid.SelectionController.CurrentCellManager.CurrentRowColumnIndex.RowIndex;
             //int columnIndex = DataGrid.SelectionController.CurrentCellManager.CurrentRowColumnIndex.ColumnIndex;
             //int scrollRowIndex = DataGrid.GetVisualContainer().ScrollRows.LastBodyVisibleLineIndex;
@@ -2318,13 +2318,13 @@ namespace InABox.DynamicGrid
         //    //IncrementalItemsSource.LoadItems(list);
         //}
 
-        public override void AddVisualFilter(string column, string value)
+        public override void AddVisualFilter(string column, string value, FilterType filtertype = FilterType.Contains)
         {
-            if (!string.IsNullOrWhiteSpace(value))
-            {
-                DataGrid.Columns[column].FilterPredicates.Add(new FilterPredicate { FilterType = FilterType.Contains, FilterValue = value });
-                DataGrid.Columns[column].FilteredFrom = FilteredFrom.FilterRow;
-            }
+            if (string.IsNullOrWhiteSpace(value))
+                return;
+
+            DataGrid.Columns[column].FilterPredicates.Add(new FilterPredicate { FilterType = filtertype, FilterValue = value });
+            DataGrid.Columns[column].FilteredFrom = FilteredFrom.FilterRow;
         }
 
         #endregion
@@ -2549,10 +2549,10 @@ namespace InABox.DynamicGrid
         }
 
         private void Add_Click(object sender, RoutedEventArgs e)
-        {    
-                DoAdd();
+        {
+            DoAdd();
         }
-        
+
         public virtual DynamicEditorPages LoadEditorPages(T item)
         {
             DynamicEditorPages pages = new DynamicEditorPages();
@@ -2584,7 +2584,7 @@ namespace InABox.DynamicGrid
         {
             form.BeforeLoad();
         }
-        
+
         public override void InitialiseEditorForm(IDynamicEditorForm editor, T[] items, Func<Type, CoreTable>? pageDataHandler = null, bool preloadPages = false)
         {
             var pages = items.Length == 1 ? LoadEditorPages(items.First()) : new DynamicEditorPages();
@@ -2622,7 +2622,7 @@ namespace InABox.DynamicGrid
             editor.OnEditorValueChanged += (s, n, v) => EditorValueChanged(editor, items, n, v);
 
             editor.OnAfterEditorValueChanged += (g, n) => AfterEditorValueChanged(g, items, n);
-            
+
             editor.OnReconfigureEditors = g => ReconfigureEditors(g, items);
 
             editor.OnValidateData += (o, i) => ValidateData(items);
@@ -2639,7 +2639,7 @@ namespace InABox.DynamicGrid
                 {
                     using var Wait = new WaitCursor();
                     DoBeforeSave(editor, items);
-                    
+
 
                     if (items.Length == 1)
                         editor.UnloadEditorPages(false);
@@ -2647,7 +2647,7 @@ namespace InABox.DynamicGrid
                         SaveItem(item);
                     if (items.Length == 1)
                         editor.UnloadEditorPages(true);
-                    
+
                     DoAfterSave(editor, items);
 
                 }
@@ -2676,7 +2676,7 @@ namespace InABox.DynamicGrid
         public override bool EditItems(T[] items, Func<Type, CoreTable>? PageDataHandler = null, bool PreloadPages = false)
         {
             DynamicEditorForm editor;
-            using(var cursor = new WaitCursor())
+            using (var cursor = new WaitCursor())
             {
                 editor = new DynamicEditorForm();
                 editor.SetValue(Panel.ZIndexProperty, 999);
@@ -2694,7 +2694,7 @@ namespace InABox.DynamicGrid
             return changes;
         }
 
-        protected virtual void OnAfterEditorValueChanged(DynamicEditorGrid grid, T[] items, String columnnname, Dictionary<String,object?> changes)
+        protected virtual void OnAfterEditorValueChanged(DynamicEditorGrid grid, T[] items, String columnnname, Dictionary<String, object?> changes)
         {
         }
 
@@ -2765,7 +2765,7 @@ namespace InABox.DynamicGrid
                     var values = editor.Values(colname, items);
                     Dispatcher.Invoke(
                         () =>
-                        { 
+                        {
                             try
                             {
                                 //Logger.Send(LogType.Information, typeof(T).Name, "Dispatching Results" + colname);
@@ -2845,10 +2845,10 @@ namespace InABox.DynamicGrid
 
             if (rows == null || !rows.Any())
             {
-                
+
                 if (!CanCreateItems())
                     return false;
-                
+
                 var item = CreateItem();
 
                 // Yea, and this won't work, because we're actually usually showing the description of a linked item,
@@ -3086,7 +3086,7 @@ namespace InABox.DynamicGrid
             result.LoadColumns(new Columns<T>(fields));
             return result;
         }
-        
+
         protected virtual Guid GetImportID()
         {
             return Guid.Empty;
@@ -3218,7 +3218,8 @@ namespace InABox.DynamicGrid
             }
 
             var sort = LookupFactory.DefineSort<T>();
-            Reload(filters, reloadColumns, ref sort, (data, err) => Dispatcher.Invoke(() => {
+            Reload(filters, reloadColumns, ref sort, (data, err) => Dispatcher.Invoke(() =>
+            {
                 if (data is not null)
                 {
                     var newData = new CoreTable();
@@ -3265,7 +3266,8 @@ namespace InABox.DynamicGrid
         /// <returns>A list of tables, in the same order as they came in <paramref name="tableColumns"/></returns>
         protected virtual IEnumerable<Tuple<Type?, CoreTable>> LoadExportTables(Filters<T> filter, IEnumerable<Tuple<Type, IColumns>> tableColumns)
         {
-            return tableColumns.Select(x => {
+            return tableColumns.Select(x =>
+            {
                 var table = new CoreTable();
                 table.LoadColumns(x.Item2);
                 return new Tuple<Type?, CoreTable>(x.Item1, table);
@@ -3353,7 +3355,7 @@ namespace InABox.DynamicGrid
             var button = CreateButton(image, caption, tooltip);
             button.Margin = position == DynamicGridButtonPosition.Right
                 ? new Thickness(2, 2, 0, 0)
-                : bFirstButtonAdded && AnyButtonsVisible() 
+                : bFirstButtonAdded && AnyButtonsVisible()
                     ? new Thickness(0, 2, 0, 0)
                     : new Thickness(0, 2, 2, 0);
             button.Padding = !String.IsNullOrWhiteSpace(caption) ? new Thickness(5, 1, 5, 1) : new Thickness(1);
@@ -3419,19 +3421,19 @@ namespace InABox.DynamicGrid
             if (e.Data.GetDataPresent(DragFormat))
             {
                 var data = e.Data.GetData(DragFormat) as DynamicGridDragFormat;
-                if(data is not null)
+                if (data is not null)
                 {
                     var table = new CoreTable();
-                    foreach(var column in data.Table.Columns)
+                    foreach (var column in data.Table.Columns)
                     {
-                        if(column is DataColumn dataColumn)
+                        if (column is DataColumn dataColumn)
                         {
                             table.Columns.Add(new CoreColumn { ColumnName = dataColumn.ColumnName, DataType = dataColumn.DataType });
                         }
                     }
-                    foreach(var row in data.Table.Rows)
+                    foreach (var row in data.Table.Rows)
                     {
-                        if(row is DataRow dataRow)
+                        if (row is DataRow dataRow)
                         {
                             var coreRow = table.NewRow();
                             coreRow.LoadValues(dataRow.ItemArray);
@@ -3465,7 +3467,7 @@ namespace InABox.DynamicGrid
         private void RowDragDropController_DragStart(object? sender, GridRowDragStartEventArgs e)
         {
             var rows = new List<CoreRow>();
-            foreach(var record in e.DraggingRecords)
+            foreach (var record in e.DraggingRecords)
             {
                 var rowIndex = DataGrid.ResolveToRowIndex(record);
                 rows.Add(GetRowFromIndex(rowIndex));

+ 2 - 1
inabox.wpf/DynamicGrid/IDynamicGrid.cs

@@ -7,6 +7,7 @@ using System.Windows;
 using System.Windows.Controls;
 using System.Windows.Media.Imaging;
 using InABox.Core;
+using Syncfusion.Data;
 
 namespace InABox.DynamicGrid
 {
@@ -45,7 +46,7 @@ namespace InABox.DynamicGrid
 
         event OnDoubleClick? OnDoubleClick;
 
-        void AddVisualFilter(string column, string value);
+        void AddVisualFilter(string column, string value, FilterType filtertype = FilterType.Contains);
 
         Button AddButton(string caption, BitmapImage? image, string? tooltip, Func<Button, CoreRow[], bool> action, DynamicGridButtonPosition position = DynamicGridButtonPosition.Left);
 

+ 4 - 3
inabox.wpf/DynamicGrid/MultiSelectDialog.cs

@@ -7,12 +7,13 @@ using System.Windows.Controls;
 using InABox.Clients;
 using InABox.Core;
 using InABox.Wpf;
+using Syncfusion.Data;
 
 namespace InABox.DynamicGrid
 {
     public interface IMultiSelectDialog
     {
-        bool ShowDialog(String? column = null, String? filter = null);
+        bool ShowDialog(String? column = null, String? filter = null, FilterType filtertype = FilterType.Contains);
         Guid[] IDs();
         CoreTable Data();
     }
@@ -97,13 +98,13 @@ namespace InABox.DynamicGrid
             grid.Children.Add(CancelButton);
         }
 
-        public bool ShowDialog(String? column = null, String? value = null)
+        public bool ShowDialog(String? column = null, String? value = null, FilterType filtertype = FilterType.Contains)
         {
             window = new ThemableWindow { Title = "Select Items", WindowStyle = WindowStyle.SingleBorderWindow };
             window.Content = grid;
             datagrid.Refresh(true, true);
             if (!String.IsNullOrEmpty(column) && !String.IsNullOrEmpty(value))
-                datagrid.AddVisualFilter(column, value);
+                datagrid.AddVisualFilter(column, value, filtertype);
             if (window.ShowDialog() == true)
                 return true;
             return false;