Sic.Framework/MECF.Framework.UI.Client/DataGridTransform/ExtendedGrid/Classes/AutoFilterHelper.cs

1582 lines
74 KiB
C#

using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.ComponentModel;
using System.Data;
using System.Globalization;
using System.Linq;
using System.Text;
using System.Windows.Controls;
using System.Windows.Controls.Primitives;
using System.Windows.Data;
using ExtendedGrid.ExtendedGridControl;
using ExtendedGrid.Styles;
namespace ExtendedGrid.Classes
{
internal sealed class AutoFilterHelper
{
public AutoFilterHelper(ExtendedDataGrid grid)
{
CurrentGrid = grid;
}
public ListBox CurrentSigmaListBox{ get; set; }
public ObservableCollection<CheckedListItem> CurrentDistictValues { get; set; }
public ListBox CurrentListBox { get; set; }
public string CurrentColumName { get; set; }
public ExtendedDataGrid CurrentGrid { get;private set; }
public string CurrentSigmaColumn { get; set; }
public ObservableCollection<CheckedListItem> GetDistictValues(DataGrid grid, string columnName)
{
if(grid.ItemsSource is DataView)
{
var itemSource = (DataView)grid.ItemsSource;
var ditictValues = new ObservableCollection<CheckedListItem>
{
new CheckedListItem
{IsChecked = false, Name = "(Select All)", IsSelectAll = "(Select All)"}
};
DataTable table = itemSource.Table;
List<string> filteredValues = GetFilteredColumnValues(columnName, itemSource);
foreach (DataRow row in table.Rows)
{
object value = row[columnName];
if (ditictValues.Count(c => Convert.ToString(c.Name) == Convert.ToString(value) && c.IsSelectAll != "(Select All)") == 0)
{
if (!string.IsNullOrEmpty(Convert.ToString(value)))
{
ditictValues.Add(new CheckedListItem { Name = value, IsChecked = filteredValues.Contains("'" + value + "'") });
}
else if (value == null)
{
ditictValues.Add(new CheckedListItem { Name = null, IsChecked = filteredValues.Contains(null) });
}
else if (string.IsNullOrEmpty(Convert.ToString(value)))
{
ditictValues.Add(new CheckedListItem { Name = value, IsChecked = filteredValues.Contains("") });
}
}
CurrentDistictValues = ditictValues;
}
if (ditictValues.Count(c => c.IsChecked) == ditictValues.Count - 1)
ditictValues[0].IsChecked = true;
return ditictValues;
}
else if (CollectionViewSource.GetDefaultView(grid.ItemsSource) != null)
{
var ditictValues = new ObservableCollection<CheckedListItem>
{
new CheckedListItem
{IsChecked = false, Name = "(Select All)", IsSelectAll = "(Select All)"}
};
ICollectionView view = CollectionViewSource.GetDefaultView(grid.ItemsSource);
_view = view;
var unquieValues=new HashSet<string>();
foreach (var rowData in grid.ItemsSource)
{
var propertyValue = rowData.GetType().GetProperty(columnName);
if(propertyValue!=null)
{
var data = propertyValue.GetValue(rowData, null) == null ? null : Convert.ToString(propertyValue.GetValue(rowData, null));
if(!unquieValues.Contains(data))
{
unquieValues.Add(data);
}
}
}
List<string> filteredValues = string.IsNullOrEmpty(FilterExpression)?new List<string>() : GetFilteredColumnValues(columnName, FilterExpression);
foreach(var value in unquieValues)
{
if (ditictValues.Count(c => Convert.ToString(c.Name) == value && c.IsSelectAll != "(Select All)") == 0)
{
if (!string.IsNullOrEmpty(Convert.ToString(value)))
{
ditictValues.Add(new CheckedListItem { Name = value, IsChecked = filteredValues.Contains("'" + value + "'") });
}
else if (value == null)
{
ditictValues.Add(new CheckedListItem { Name = null, IsChecked = filteredValues.Contains(null) });
}
else if (string.IsNullOrEmpty(Convert.ToString(value)))
{
ditictValues.Add(new CheckedListItem { Name = value, IsChecked = filteredValues.Contains("") });
}
}
}
CurrentDistictValues = ditictValues;
return ditictValues;
}
return null;
}
public void ApplyFilters(DataGrid grid, string columnName, object value)
{
value = AddEscapeSequece(value);
if(grid.ItemsSource is DataView)
{
var itemSource = (DataView)grid.ItemsSource;
if (itemSource == null) return;
if (!string.IsNullOrEmpty(itemSource.RowFilter))
{
string filter = FilterGenerator(itemSource.RowFilter, columnName, value);
if (filter != itemSource.RowFilter)
{
itemSource.RowFilter = CorrectRowFilter(filter);
grid.Items.Refresh();
}
}
else
{
if (string.IsNullOrEmpty(Convert.ToString(value)))
{
string dummy = value == null ? null : "";
switch (dummy)
{
case "":
itemSource.RowFilter = "[" + columnName + "]" + " = ''";
break;
case null:
itemSource.RowFilter = "[" + columnName + "]" + " IS Null";
break;
}
}
else
if(itemSource.Table.Columns[columnName].DataType.BaseType.ToString()=="System.Enum")
{
var value1 = Convert.ToInt32(Enum.Parse(itemSource.Table.Columns[columnName].DataType, Convert.ToString(value)));
itemSource.RowFilter = "[" + columnName + "]" + " " + " IN " + "(" + value1 + ")";
}
else
itemSource.RowFilter = "[" + columnName + "]" + " " + " IN " + "(" + "'" + value + "'" + ")";
}
int count = CurrentDistictValues.Count(c => c.IsChecked);
if (count == CurrentDistictValues.Count - 1)
{
CurrentDistictValues[0].IsChecked = true;
if (CurrentListBox != null)
{
CurrentListBox.ItemsSource = CurrentDistictValues;
CurrentListBox.UpdateLayout();
CurrentListBox.Items.Refresh();
}
}
if (CurrentListBox != null)
{
var clearButton = FindControls.FindChild<Button>(CurrentListBox.Parent, "btnClear");
if (clearButton != null)
{
clearButton.IsEnabled = CurrentDistictValues.Count(c => c.IsChecked) > 0;
}
}
}
else if (CollectionViewSource.GetDefaultView(grid.ItemsSource) != null)
{
_view = CollectionViewSource.GetDefaultView(grid.ItemsSource);
if (!string.IsNullOrEmpty(FilterExpression))
{
string filter = FilterGenerator(FilterExpression, columnName, value);
if (filter != FilterExpression)
{
FilterExpression = CorrectRowFilter(filter);
grid.Items.Refresh();
}
}
else
{
if (string.IsNullOrEmpty(Convert.ToString(value)))
{
string dummy = value == null ? null : "";
switch (dummy)
{
case "":
FilterExpression = "[" + columnName + "]" + " = ''";
break;
case null:
FilterExpression = "[" + columnName + "]" + " IS Null";
break;
}
}
else
{
var readOnlyCollection = (((ListCollectionView)(_view))).ItemProperties;
if (readOnlyCollection != null)
{
var item =
readOnlyCollection.First(
c => c.Name == columnName);
if (item.PropertyType.BaseType != null && item.PropertyType.BaseType.ToString() == "System.Enum")
{
var value1 = Convert.ToInt32(Enum.Parse(item.PropertyType, Convert.ToString(value)));
FilterExpression = "[" + columnName + "]" + " " + " IN " + "(" + value1 + ")";
}
else
FilterExpression = "[" + columnName + "]" + " " + " IN " + "(" + "'" + value + "'" + ")";
}
}
}
int count = CurrentDistictValues.Count(c => c.IsChecked);
if (count == CurrentDistictValues.Count - 1)
{
CurrentDistictValues[0].IsChecked = true;
if (CurrentListBox != null)
{
CurrentListBox.ItemsSource = CurrentDistictValues;
CurrentListBox.UpdateLayout();
CurrentListBox.Items.Refresh();
}
}
if (CurrentListBox != null)
{
var clearButton = FindControls.FindChild<Button>(CurrentListBox.Parent, "btnClear");
if (clearButton != null)
{
clearButton.IsEnabled = CurrentDistictValues.Count(c => c.IsChecked) > 0;
}
}
}
}
private object AddEscapeSequece(object value)
{
if (string.IsNullOrEmpty(Convert.ToString(value))) return value;
string newValue = EscapeLikeValue(value.ToString());
return newValue;
}
private string FilterNullAndBlanlValues(object value, string columnName, string existingFilter,
int startIndex)
{
string newFilter = existingFilter.Trim();
if (startIndex != -1)
{
if (Convert.ToString(value) == "" && value != null)
{
//NOT TESTED
int startIndex1 = newFilter.IndexOf("[" + columnName + "]" + " = ''", StringComparison.Ordinal);
if (startIndex1 != -1)
{
int lastIndex1 = startIndex1 + Convert.ToString("[" + columnName + "]" + " = ''").Length;
if (lastIndex1 == newFilter.Length)
{
if (!newFilter.Contains("[" + columnName + "]" + " IS Null"))
{
newFilter = newFilter.Insert(lastIndex1, " Or ([" + columnName + "]" + " IS Null)");
}
}
else
{
if (!newFilter.Contains("[" + columnName + "]" + " = ''"))
{
newFilter = newFilter.Insert(lastIndex1, " Or ([" + columnName + "]" + " = '') AND");
}
}
}
else
{
//TESTED
string actaulFilter = newFilter.Substring(startIndex + (columnName + " " + " IN ").Length + 1);
int lastIndex = actaulFilter.IndexOf(")", StringComparison.Ordinal);
actaulFilter = actaulFilter.Substring(0, lastIndex);
int isNullLastIndex = newFilter.IndexOf("[" + columnName + "] IS Null)", StringComparison.Ordinal);
int lastIndex1 = startIndex + ("[" + columnName + "]" + " " + " IN ").Length +
actaulFilter.Length;
if (lastIndex1 < isNullLastIndex)
{
lastIndex1 = isNullLastIndex + Convert.ToString("[" + columnName + "] IS Null)").Length;
}
if (lastIndex1 + 1 == newFilter.Length) lastIndex1 = newFilter.Length;
if (lastIndex1 == newFilter.Length)
{
if (!newFilter.Contains("[" + columnName + "]" + " = ''"))
{
newFilter = newFilter.Insert(lastIndex1, " Or ([" + columnName + "]" + " = '')");
}
}
else
{
if (!newFilter.Contains("[" + columnName + "]" + " = ''"))
{
newFilter = newFilter.Insert(lastIndex1, " Or ([" + columnName + "]" + " = '') AND");
}
}
}
}
else if (value == null)
{
//NOT TESTED
int startIndex1 = newFilter.IndexOf("[" + columnName + "]" + " IS Null)", StringComparison.Ordinal);
if (startIndex1 != -1)
{
if (!newFilter.Contains("[" + columnName + "]" + " IS Null"))
{
int lastIndex1 = startIndex1 + Convert.ToString("[" + columnName + "]" + " IS Null)").Length;
int x = 0;
if (lastIndex1 == newFilter.Length)
x = 0;
else if (lastIndex1 + 1 == newFilter.Length)
x = 1;
newFilter = lastIndex1 + x == newFilter.Length
? newFilter.Insert(lastIndex1, " Or ([" + columnName + "]" + " IS Null)")
: newFilter.Insert(lastIndex1, " Or ([" + columnName + "]" + " IS Null) AND");
}
}
else
{
//TESTED
if (!newFilter.Contains("[" + columnName + "]" + " IS Null"))
{
string actaulFilter =
newFilter.Substring(startIndex + (columnName + " " + " IN ").Length + 1);
int lastIndex = actaulFilter.IndexOf(")", StringComparison.Ordinal);
actaulFilter = actaulFilter.Substring(0, lastIndex);
int isNullLastIndex = newFilter.IndexOf("([" + columnName + "]" + " = '')", StringComparison.Ordinal);
int lastIndex1 = startIndex + ("[" + columnName + "]" + " " + " IN ").Length +
actaulFilter.Length + 1;
if (isNullLastIndex > lastIndex1)
{
lastIndex1 = isNullLastIndex +
Convert.ToString("([" + columnName + "]" + " = '')").Length;
}
if (lastIndex1 > newFilter.Length)
lastIndex1 = newFilter.Length;
newFilter = lastIndex1 == newFilter.Length
? newFilter.Insert(lastIndex1, " Or ([" + columnName + "]" + " IS Null)")
: newFilter.Insert(lastIndex1, " Or ([" + columnName + "]" + " IS Null) AND");
}
}
}
}
else if (newFilter.Contains("[" + columnName + "]" + " = ''"))
{
if (Convert.ToString(value) == "")
{
//NOT TESTED
int startIndex1 = newFilter.IndexOf("[" + columnName + "]" + " = ''", StringComparison.Ordinal);
if (startIndex1 != -1)
{
int lastIndex1 = startIndex1 + Convert.ToString("[" + columnName + "]" + " = ''").Length;
int x = 0;
if (lastIndex1 == newFilter.Length)
x = 0;
else if (lastIndex1 + 1 == newFilter.Length)
x = 1;
if (!newFilter.Contains("[" + columnName + "]" + " IS Null"))
{
newFilter = lastIndex1 + x == newFilter.Length
? newFilter.Insert(lastIndex1, " Or ([" + columnName + "]" + " IS Null)")
: newFilter.Insert(lastIndex1, " Or ([" + columnName + "]" + " IS Null) AND");
}
}
}
else
{
//NOT TESTED
int startIndex1 = newFilter.IndexOf("[" + columnName + "]" + " = ''", StringComparison.Ordinal);
int startIndex2 = newFilter.IndexOf("[" + columnName + "]" + " IS Null", StringComparison.Ordinal);
if (startIndex2 != -1)
{
startIndex1 = Math.Min(startIndex1, startIndex2);
}
if (startIndex1 != -1)
{
newFilter = newFilter.Insert(startIndex1,
"[" + columnName + "]" + " " + " IN " + "(" + "'" + value + "'" +
") Or ");
}
}
}
else if (newFilter.Contains("[" + columnName + "]" + " IS Null"))
{
if (Convert.ToString(value) == "")
{
//TESTED
int startIndex1 = newFilter.IndexOf("[" + columnName + "]" + " IS Null", StringComparison.Ordinal);
if (startIndex1 != -1)
{
int lastIndex1 = startIndex1 + Convert.ToString("[" + columnName + "]" + " IS Null").Length;
if (!newFilter.Contains("[" + columnName + "]" + " = ''"))
{
int x = 0;
if (lastIndex1 == newFilter.Length)
x = 0;
else if (lastIndex1 + 1 == newFilter.Length)
x = 1;
else if (lastIndex1 + 2 == newFilter.Length)
x = 2;
newFilter = lastIndex1 + x == newFilter.Length
? newFilter.Insert(lastIndex1, " Or ([" + columnName + "]" + " = '')")
: newFilter.Insert(lastIndex1, " Or ([" + columnName + "]" + " = '') AND");
}
}
}
else
{
//NOT TESTED
int startIndex1 = newFilter.IndexOf("[" + columnName + "]" + " = ''", StringComparison.Ordinal);
int startIndex2 = newFilter.IndexOf("[" + columnName + "]" + " IS Null", StringComparison.Ordinal);
if (startIndex2 != -1)
{
startIndex1 = Math.Min(startIndex1, startIndex2);
}
if (startIndex1 != -1)
{
newFilter = newFilter.Insert(startIndex1,
"[" + columnName + "]" + " " + " IN " + "(" + "'" + value + "'" +
") Or ");
}
}
}
else
{
if (Convert.ToString(value) == "" && value != null)
{
newFilter = newFilter + "AND ([" + columnName + "]" + " = '')";
}
else if (value == null)
{
newFilter = newFilter + "AND ([" + columnName + "]" + " IS Null)";
}
}
return newFilter;
}
private string FilterGenerator(string exisitngFilter, string columnName, object value)
{
var isEnumType = false;
int enumValue = -1;
if (CurrentGrid.ItemsSource is DataView)
{
var dv = CurrentGrid.ItemsSource as DataView;
var baseType = dv.Table.Columns[columnName].DataType.BaseType;
if (baseType != null)
{
isEnumType = baseType.ToString().Equals("System.Enum");
if (isEnumType)
enumValue = Convert.ToInt32(Enum.Parse(dv.Table.Columns[columnName].DataType, Convert.ToString(value)));
}
}
else if (CollectionViewSource.GetDefaultView(CurrentGrid.ItemsSource) != null)
{
var readOnlyCollection = (((ListCollectionView)(CollectionViewSource.GetDefaultView(CurrentGrid.ItemsSource)))).ItemProperties;
if (readOnlyCollection != null)
{
var item =
readOnlyCollection.First(
c => c.Name == columnName);
if (item.PropertyType.BaseType != null && item.PropertyType.BaseType.ToString() == "System.Enum")
{
isEnumType = true;
enumValue = Convert.ToInt32(Enum.Parse(item.PropertyType, Convert.ToString(value)));
}
}
}
string newFilter = exisitngFilter;
if (newFilter.Contains("[" + columnName + "]" + " " + " IN ") ||
newFilter.Contains("[" + columnName + "]" + " = ''") ||
newFilter.Contains("[" + columnName + "]" + " IS Null"))
{
int startIndex = newFilter.IndexOf("[" + columnName + "]" + " " + " IN ", StringComparison.Ordinal);
if (startIndex != -1)
{
if (!string.IsNullOrEmpty(Convert.ToString(value)))
{
string actaulFilter =
newFilter.Substring(startIndex + ("[" + columnName + "]" + " " + " IN ").Length + 1);
int lastIndex = actaulFilter.LastIndexOf(")", StringComparison.Ordinal);
actaulFilter = actaulFilter.Substring(0, lastIndex);
string[] listOfFilter = actaulFilter.Split(',');
if (listOfFilter.Contains("'" + value + "'"))
return exisitngFilter;
int indexToput = startIndex + ("[" + columnName + "]" + " " + " IN ").Length +
actaulFilter.Length + 1;
newFilter = !isEnumType ? newFilter.Insert(indexToput, "," + "'" + value + "'") : newFilter.Insert(indexToput, "," + enumValue);
}
else
{
newFilter = FilterNullAndBlanlValues(value, columnName, newFilter, startIndex);
}
}
else
{
newFilter = FilterNullAndBlanlValues(value, columnName, newFilter, startIndex);
}
return newFilter.Trim();
}
newFilter = newFilter.Trim();
if (!string.IsNullOrEmpty(newFilter))
{
if (!string.IsNullOrEmpty(Convert.ToString(value)))
{
int idexAppliedOn = CurrentGrid.Columns.Count(gridColumn => newFilter.Contains("[" + gridColumn.SortMemberPath + "]" + " " + " IN ") || newFilter.Contains("[" + gridColumn.SortMemberPath + "]" + " = ''") || newFilter.Contains("[" + gridColumn.SortMemberPath + "]" + " IS Null"));
if (idexAppliedOn == 1)
newFilter = "(" + newFilter + ")";
if (!isEnumType)
newFilter = newFilter + " AND " + "(" + "[" + columnName + "]" + " " + " IN " + "(" + "'" + value +
"'" + ")" + ")";
else
{
newFilter = newFilter + " AND " + "(" + "[" + columnName + "]" + " " + " IN " + "(" + enumValue +
")" + ")";
}
}
else
{
int startIndex = newFilter.IndexOf("[" + columnName + "]" + " " + " IN ", StringComparison.Ordinal);
newFilter = FilterNullAndBlanlValues(value, columnName, newFilter, startIndex);
}
}
else
{
if (!string.IsNullOrEmpty(Convert.ToString(value)))
{
if (!isEnumType)
newFilter = "[" + columnName + "]" + " " + " IN " + "(" + "'" + value + "'" + ")";
else
{
newFilter = "[" + columnName + "]" + " " + " IN " + "(" + value + ")";
}
}
else
{
int startIndex = newFilter.IndexOf("[" + columnName + "]" + " " + " IN ", StringComparison.Ordinal);
newFilter = FilterNullAndBlanlValues(value, columnName, newFilter, startIndex);
}
}
return newFilter.Trim();
}
private List<string> GetFilteredColumnValues(string columnName, DataView view)
{
string newFilter = view.RowFilter;
if (newFilter.Contains("[" + columnName + "]" + " " + " IN "))
{
int startIndex = newFilter.IndexOf("[" + columnName + "]" + " " + " IN ", StringComparison.Ordinal);
string actaulFilter =
newFilter.Substring(startIndex + ("[" + columnName + "]" + " " + " IN ").Length + 1);
int lastIndex = actaulFilter.IndexOf(")", StringComparison.Ordinal);
actaulFilter = actaulFilter.Substring(0, lastIndex);
string[] listOfFilter = actaulFilter.Split(',');
List<string> list = listOfFilter.ToList();
var newList = new List<String>();
for (int i = 0; i < list.Count; i++)
{
if (list[i].IndexOf("'", StringComparison.Ordinal) == 0 && list[i].LastIndexOf("'", StringComparison.Ordinal) == list[i].Length - 1)
{
newList.Add(list[i]);
continue;
}
string newfilterYoBeAdded = list[i];
for (int j = i + 1; j < list.Count; j++)
{
i = j;
string current = list[j];
if (current.LastIndexOf("'", StringComparison.Ordinal) == current.Length - 1)
{
if (current.Length > 1 && current[current.Length - 2].ToString(CultureInfo.InvariantCulture) != "'")
{
newfilterYoBeAdded = newfilterYoBeAdded + "," + current;
newList.Add(newfilterYoBeAdded);
break;
}
}
else
{
newfilterYoBeAdded = newfilterYoBeAdded + "," + current;
}
}
}
if (newFilter.Contains("([" + columnName + "] IS Null)"))
{
newList.Add(null);
}
if (newFilter.Contains("([" + columnName + "] = '')"))
{
newList.Add("");
}
return newList;
}
return new List<string>();
}
private List<string> GetFilteredColumnValues(string columnName, string rowFilter)
{
string newFilter = rowFilter;
if (newFilter.Contains("[" + columnName + "]" + " " + " IN "))
{
int startIndex = newFilter.IndexOf("[" + columnName + "]" + " " + " IN ", StringComparison.Ordinal);
string actaulFilter =
newFilter.Substring(startIndex + ("[" + columnName + "]" + " " + " IN ").Length + 1);
int lastIndex = actaulFilter.IndexOf(")", StringComparison.Ordinal);
actaulFilter = actaulFilter.Substring(0, lastIndex);
string[] listOfFilter = actaulFilter.Split(',');
List<string> list = listOfFilter.ToList();
var newList = new List<String>();
for (int i = 0; i < list.Count; i++)
{
if (list[i].IndexOf("'", StringComparison.Ordinal) == 0 && list[i].LastIndexOf("'", StringComparison.Ordinal) == list[i].Length - 1)
{
newList.Add(list[i]);
continue;
}
string newfilterYoBeAdded = list[i];
for (int j = i + 1; j < list.Count; j++)
{
i = j;
string current = list[j];
if (current.LastIndexOf("'", StringComparison.Ordinal) == current.Length - 1)
{
if (current.Length > 1 && current[current.Length - 2].ToString(CultureInfo.InvariantCulture) != "'")
{
newfilterYoBeAdded = newfilterYoBeAdded + "," + current;
newList.Add(newfilterYoBeAdded);
break;
}
}
else
{
newfilterYoBeAdded = newfilterYoBeAdded + "," + current;
}
}
}
if (newFilter.Contains("([" + columnName + "] IS Null)"))
{
newList.Add(null);
}
if (newFilter.Contains("([" + columnName + "] = '')"))
{
newList.Add("");
}
return newList;
}
return new List<string>();
}
public void RemoveAllFilter(DataGrid currentGrid, string currentColumn)
{
if (currentGrid.ItemsSource == null) return;
string newFilter = null;
if(currentGrid.ItemsSource is DataView)
{
var itemSource = (DataView)currentGrid.ItemsSource;
newFilter = itemSource.RowFilter;
}
else if (CollectionViewSource.GetDefaultView(currentGrid.ItemsSource) != null)
{
newFilter = ((ExtendedDataGrid)currentGrid).AutoFilterHelper.FilterExpression;
}
if (string.IsNullOrEmpty(newFilter)) return;
if (newFilter.Contains("[" + currentColumn + "]" + " " + " IN "))
{
int startIndex = newFilter.IndexOf("[" + currentColumn + "]" + " " + " IN ", StringComparison.Ordinal);
string actaulFilter =
newFilter.Substring(startIndex + ("[" + currentColumn + "]" + " " + " IN ").Length + 1);
int lastIndex = actaulFilter.IndexOf(")", StringComparison.Ordinal);
actaulFilter = actaulFilter.Substring(0, lastIndex);
string relalValue = "[" + currentColumn + "]" + " " + " IN " + "(" + actaulFilter + ")";
if (newFilter.Contains("(" + "[" + relalValue + "]" + ")"))
{
newFilter = newFilter.Replace("(" + "[" + relalValue + "]" + ")", "");
if (newFilter.IndexOf("( AND (", StringComparison.Ordinal) == 0)
{
newFilter = newFilter.Replace("( AND (", "");
}
if (newFilter.IndexOf("(((", StringComparison.Ordinal) == 0)
{
newFilter = newFilter.Substring(2);
}
if (newFilter.Contains("))) AND "))
{
newFilter = newFilter.Replace("))) AND ", ")");
}
if (newFilter.LastIndexOf(" AND", StringComparison.Ordinal) == newFilter.Length - 5)
{
newFilter = newFilter.Substring(0, newFilter.Length - 5);
}
if (newFilter.Contains(" AND )"))
{
newFilter = newFilter.Replace(" AND )", "");
}
if (newFilter.IndexOf("((", StringComparison.Ordinal) == 0)
{
newFilter = newFilter.Substring(2);
}
if (newFilter.IndexOf(" AND ", StringComparison.Ordinal) == 0)
{
newFilter = newFilter.Substring(5);
}
}
else
{
newFilter = newFilter.Replace(relalValue, "");
if (newFilter == "')")
{
newFilter = "";
if (currentGrid.ItemsSource is DataView)
{
var itemSource = (DataView)currentGrid.ItemsSource;
itemSource.RowFilter = CorrectRowFilter(newFilter);
}
else if (CollectionViewSource.GetDefaultView(currentGrid.ItemsSource) != null)
{
((ExtendedDataGrid)currentGrid).AutoFilterHelper.FilterExpression = CorrectRowFilter(newFilter);
}
var stackPanel = CurrentListBox.Parent as StackPanel;
if (stackPanel != null)
{
var popup = stackPanel.Parent as Popup;
if (popup != null)
{
popup.Tag = "True";
}
}
return;
}
}
}
newFilter = RemoveIsNullAndBlankFilter(newFilter, currentColumn);
if (currentGrid.ItemsSource is DataView)
{
var itemSource = (DataView)currentGrid.ItemsSource;
itemSource.RowFilter = CorrectRowFilter(newFilter);
}
else if (CollectionViewSource.GetDefaultView(currentGrid.ItemsSource) != null)
{
((ExtendedDataGrid)currentGrid).AutoFilterHelper.FilterExpression = CorrectRowFilter(newFilter);
}
int count = CurrentDistictValues.Count(c => c.IsChecked);
if (count == CurrentDistictValues.Count - 1)
{
CurrentDistictValues[0].IsChecked = true;
if (CurrentListBox != null)
{
CurrentListBox.ItemsSource = CurrentDistictValues;
CurrentListBox.UpdateLayout();
CurrentListBox.Items.Refresh();
}
}
if (CurrentListBox != null)
{
var clearButton = FindControls.FindChild<Button>(CurrentListBox.Parent, "btnClear");
if (clearButton != null)
{
clearButton.IsEnabled = CurrentDistictValues.Count(c => c.IsChecked) > 0;
}
}
CurrentGrid.Items.Refresh();
}
public void RemoveFilters(DataGrid grid, string columnName, object value)
{
var isEnumType = false;
int enumValue = -1;
if (CurrentGrid.ItemsSource is DataView)
{
var dv = CurrentGrid.ItemsSource as DataView;
var baseType = dv.Table.Columns[columnName].DataType.BaseType;
if (baseType != null)
{
isEnumType = baseType.ToString().Equals("System.Enum");
if (isEnumType)
enumValue = Convert.ToInt32(Enum.Parse(dv.Table.Columns[columnName].DataType, Convert.ToString(value)));
}
}
else if (CollectionViewSource.GetDefaultView(CurrentGrid.ItemsSource) != null)
{
var readOnlyCollection = (((ListCollectionView)(CollectionViewSource.GetDefaultView(CurrentGrid.ItemsSource)))).ItemProperties;
if (readOnlyCollection != null)
{
var item =
readOnlyCollection.First(
c => c.Name == columnName);
if (item.PropertyType.BaseType != null && item.PropertyType.BaseType.ToString() == "System.Enum")
{
isEnumType = true;
enumValue = Convert.ToInt32(Enum.Parse(item.PropertyType, Convert.ToString(value)));
}
}
}
value = AddEscapeSequece(value);
string rowFilter = null;
if (grid.ItemsSource == null)
return;
if (grid.ItemsSource is DataView)
{
rowFilter = ((DataView)grid.ItemsSource).RowFilter;
}
else if (CollectionViewSource.GetDefaultView(grid.ItemsSource) != null)
{
rowFilter = ((ExtendedDataGrid)grid).AutoFilterHelper.FilterExpression;
}
if (!string.IsNullOrEmpty(rowFilter))
{
string newFilter = rowFilter;
if (newFilter.Contains("[" + columnName + "]" + " " + " IN ") &&
!string.IsNullOrEmpty(Convert.ToString(value)))
{
int startIndex = newFilter.IndexOf("[" + columnName + "]" + " " + " IN ", StringComparison.Ordinal);
string actaulFilter =
newFilter.Substring(startIndex + ("[" + columnName + "]" + " " + " IN ").Length + 1);
int lastIndex = actaulFilter.LastIndexOf(")", StringComparison.Ordinal);
actaulFilter = actaulFilter.Substring(0, lastIndex);
string[] listOfFilter = actaulFilter.Split(',');
if (!isEnumType)
{
if (listOfFilter.Contains("'" + value + "'"))
{
string realFilter = "[" + columnName + "]" + " " + " IN " + "(" + actaulFilter + ")";
string replaced = realFilter.Replace("'" + value + "'", "");
if (replaced.Contains(",,"))
{
replaced = replaced.Replace(",,", ",");
}
if (replaced.Contains(",)"))
{
replaced = replaced.Replace(",)", ")");
}
if (replaced.Contains("()"))
{
replaced = "";
}
if (replaced.Contains("(,"))
{
replaced = replaced.Replace("(,", "(");
}
if (replaced.Contains(",)"))
{
replaced = replaced.Replace(",)", ")");
}
if (newFilter.Contains(" AND ()"))
{
newFilter = newFilter.Replace(" AND ()", "");
}
newFilter = newFilter.Replace(realFilter, replaced);
if (newFilter.Contains("() AND "))
{
newFilter = newFilter.Replace("() AND ", "");
}
if (newFilter.IndexOf("(((", StringComparison.Ordinal) == 0)
{
newFilter = newFilter.Substring(2);
}
if (newFilter.Contains(")))"))
{
newFilter = newFilter.Replace(")))", "))");
}
if (newFilter.Contains("()"))
{
newFilter = newFilter.Replace("()", "");
}
if (newFilter.LastIndexOf(" AND ", StringComparison.Ordinal) == newFilter.Length - 5)
{
newFilter = newFilter.Substring(0, newFilter.Length - 5);
}
if (newFilter.IndexOf("((", StringComparison.Ordinal) == 0)
{
newFilter = newFilter.Substring(1);
}
newFilter = newFilter.Trim();
if (newFilter.IndexOf("Or", StringComparison.Ordinal) == 0)
{
newFilter = newFilter.Substring(3);
}
switch (newFilter)
{
case "":
if (grid.ItemsSource is DataView)
{
((DataView)grid.ItemsSource).RowFilter = null;
}
else if (CollectionViewSource.GetDefaultView(grid.ItemsSource) != null)
{
((ExtendedDataGrid)grid).AutoFilterHelper.FilterExpression = null;
}
return;
default:
if (grid.ItemsSource is DataView)
{
((DataView)grid.ItemsSource).RowFilter = CorrectRowFilter(newFilter);
}
else if (CollectionViewSource.GetDefaultView(grid.ItemsSource) != null)
{
((ExtendedDataGrid)grid).AutoFilterHelper.FilterExpression = CorrectRowFilter(newFilter);
}
break;
}
int count1 =
CurrentDistictValues.Count(c => c.IsChecked && Convert.ToString(c.Name) != "(Select All)");
if (count1 == CurrentDistictValues.Count - 1)
{
CurrentDistictValues[0].IsChecked = true;
if (CurrentListBox != null)
{
CurrentListBox.ItemsSource = CurrentDistictValues;
CurrentListBox.UpdateLayout();
CurrentListBox.Items.Refresh();
}
}
else
{
CurrentDistictValues[0].IsChecked = false;
if (CurrentListBox != null)
{
CurrentListBox.ItemsSource = CurrentDistictValues;
CurrentListBox.UpdateLayout();
CurrentListBox.Items.Refresh();
}
}
}
}
else
{
if (listOfFilter.Contains(enumValue.ToString(CultureInfo.InvariantCulture)))
{
string realFilter = "[" + columnName + "]" + " " + " IN " + "(" + actaulFilter + ")";
string replaced = realFilter.Replace(enumValue.ToString(CultureInfo.InvariantCulture), "");
if (replaced.Contains(",,"))
{
replaced = replaced.Replace(",,", ",");
}
if (replaced.Contains(",)"))
{
replaced = replaced.Replace(",)", ")");
}
if (replaced.Contains("()"))
{
replaced = "";
}
if (replaced.Contains("(,"))
{
replaced = replaced.Replace("(,", "(");
}
if (replaced.Contains(",)"))
{
replaced = replaced.Replace(",)", ")");
}
if (newFilter.Contains(" AND ()"))
{
newFilter = newFilter.Replace(" AND ()", "");
}
newFilter = newFilter.Replace(realFilter, replaced);
if (newFilter.Contains("() AND "))
{
newFilter = newFilter.Replace("() AND ", "");
}
if (newFilter.IndexOf("(((", StringComparison.Ordinal) == 0)
{
newFilter = newFilter.Substring(2);
}
if (newFilter.Contains(")))"))
{
newFilter = newFilter.Replace(")))", "))");
}
if (newFilter.Contains("()"))
{
newFilter = newFilter.Replace("()", "");
}
if (newFilter.LastIndexOf(" AND ", StringComparison.Ordinal) == newFilter.Length - 5)
{
newFilter = newFilter.Substring(0, newFilter.Length - 5);
}
if (newFilter.IndexOf("((", StringComparison.Ordinal) == 0)
{
newFilter = newFilter.Substring(1);
}
newFilter = newFilter.Trim();
if (newFilter.IndexOf("Or", StringComparison.Ordinal) == 0)
{
newFilter = newFilter.Substring(3);
}
switch (newFilter)
{
case "":
if (grid.ItemsSource is DataView)
{
((DataView)grid.ItemsSource).RowFilter = null;
}
else if (CollectionViewSource.GetDefaultView(grid.ItemsSource) != null)
{
((ExtendedDataGrid)grid).AutoFilterHelper.FilterExpression = null;
}
return;
default:
if (grid.ItemsSource is DataView)
{
((DataView)grid.ItemsSource).RowFilter = CorrectRowFilter(newFilter);
}
else if (CollectionViewSource.GetDefaultView(grid.ItemsSource) != null)
{
((ExtendedDataGrid)grid).AutoFilterHelper.FilterExpression = CorrectRowFilter(newFilter);
}
break;
}
int count1 =
CurrentDistictValues.Count(c => c.IsChecked && Convert.ToString(c.Name) != "(Select All)");
if (count1 == CurrentDistictValues.Count - 1)
{
CurrentDistictValues[0].IsChecked = true;
if (CurrentListBox != null)
{
CurrentListBox.ItemsSource = CurrentDistictValues;
CurrentListBox.UpdateLayout();
CurrentListBox.Items.Refresh();
}
}
else
{
CurrentDistictValues[0].IsChecked = false;
if (CurrentListBox != null)
{
CurrentListBox.ItemsSource = CurrentDistictValues;
CurrentListBox.UpdateLayout();
CurrentListBox.Items.Refresh();
}
}
}
}
}
else
{
if (!string.IsNullOrEmpty(Convert.ToString(value)))
{
if (grid.ItemsSource is DataView)
{
string actualValue = "";
var itemSource = grid.ItemsSource as DataView;
var unquieValues = new HashSet<string>();
foreach (DataRow row in itemSource.Table.Rows)
{
var val = Convert.ToString(row[columnName]);
if (val == Convert.ToString(value))
continue;
if (!unquieValues.Contains(val))
unquieValues.Add(val);
else
continue;
if (actualValue == "")
{
actualValue = val + "'";
}
else
{
actualValue = actualValue + "," + "'" + val + "'";
}
}
actualValue = actualValue.Substring(0, actualValue.Length - 1);
ApplyFilters(grid, columnName, actualValue);
}
else if (CollectionViewSource.GetDefaultView(grid.ItemsSource) != null)
{
ICollectionView view = CollectionViewSource.GetDefaultView(grid.ItemsSource);
var unquieValues = new HashSet<string>();
string actualValue = "";
foreach (var rowData in grid.ItemsSource)
{
var propertyValue = rowData.GetType().GetProperty(columnName);
if (propertyValue != null)
{
var data = Convert.ToString(propertyValue.GetValue(rowData, null));
if (!unquieValues.Contains(data) && data != Convert.ToString(value))
{
if (actualValue == "")
{
actualValue = data + "'";
}
else
{
actualValue = actualValue + "," + "'" + data + "'";
}
unquieValues.Add(data);
}
}
}
actualValue = actualValue.Substring(0, actualValue.Length - 1);
ApplyFilters(grid, columnName, actualValue);
}
}
else
{
if (value == null)
{
if (grid.ItemsSource is DataView)
{
var itemSource = grid.ItemsSource as DataView;
if (newFilter.Contains("Or ([" + columnName + "] IS Null)"))
{
newFilter = newFilter.Replace("Or ([" + columnName + "] IS Null)", "");
itemSource.RowFilter = CorrectRowFilter(newFilter);
}
else if (newFilter.Contains("([" + columnName + "] IS Null)"))
{
newFilter = newFilter.Replace("([" + columnName + "] IS Null)", "");
itemSource.RowFilter = CorrectRowFilter(newFilter);
}
else if (newFilter.Contains("Or [" + columnName + "] IS Null"))
{
newFilter = newFilter.Replace("Or [" + columnName + "] IS Null", "");
itemSource.RowFilter = CorrectRowFilter(newFilter);
}
else if (newFilter.Contains("[" + columnName + "] IS Null"))
{
newFilter = newFilter.Replace("[" + columnName + "] IS Null", "");
itemSource.RowFilter = CorrectRowFilter(newFilter);
}
}
else if (CollectionViewSource.GetDefaultView(grid.ItemsSource) != null)
{
var mainGrid = grid as ExtendedDataGrid;
if (newFilter.Contains("Or ([" + columnName + "] IS Null)"))
{
newFilter = newFilter.Replace("Or ([" + columnName + "] IS Null)", "");
mainGrid.AutoFilterHelper.FilterExpression = CorrectRowFilter(newFilter);
}
else if (newFilter.Contains("([" + columnName + "] IS Null)"))
{
newFilter = newFilter.Replace("([" + columnName + "] IS Null)", "");
mainGrid.AutoFilterHelper.FilterExpression = CorrectRowFilter(newFilter);
}
else if (newFilter.Contains("Or [" + columnName + "] IS Null"))
{
newFilter = newFilter.Replace("Or [" + columnName + "] IS Null", "");
mainGrid.AutoFilterHelper.FilterExpression = CorrectRowFilter(newFilter);
}
else if (newFilter.Contains("[" + columnName + "] IS Null"))
{
newFilter = newFilter.Replace("[" + columnName + "] IS Null", "");
mainGrid.AutoFilterHelper.FilterExpression = CorrectRowFilter(newFilter);
}
}
}
else
{
if (grid.ItemsSource is DataView)
{
var itemSource = grid.ItemsSource as DataView;
if (newFilter.Contains("Or ([" + columnName + "] = '')"))
{
newFilter = newFilter.Replace("Or ([" + columnName + "] = '')", "");
itemSource.RowFilter = CorrectRowFilter(newFilter);
}
else if (newFilter.Contains("([" + columnName + "] = '')"))
{
newFilter = newFilter.Replace("([" + columnName + "] = '')", "");
itemSource.RowFilter = CorrectRowFilter(newFilter);
}
else if (newFilter.Contains("Or [" + columnName + "] = ''"))
{
newFilter = newFilter.Replace("Or [" + columnName + "] = ''", "");
itemSource.RowFilter = CorrectRowFilter(newFilter);
}
else if (newFilter.Contains("[" + columnName + "] = ''"))
{
newFilter = newFilter.Replace("[" + columnName + "] = ''", "");
itemSource.RowFilter = CorrectRowFilter(newFilter);
}
}
else if (CollectionViewSource.GetDefaultView(grid.ItemsSource) != null)
{
var mainGrid = grid as ExtendedDataGrid;
if (newFilter.Contains("Or ([" + columnName + "] = '')"))
{
newFilter = newFilter.Replace("Or ([" + columnName + "] = '')", "");
mainGrid.AutoFilterHelper.FilterExpression = CorrectRowFilter(newFilter);
}
else if (newFilter.Contains("([" + columnName + "] = '')"))
{
newFilter = newFilter.Replace("([" + columnName + "] = '')", "");
mainGrid.AutoFilterHelper.FilterExpression = CorrectRowFilter(newFilter);
}
else if (newFilter.Contains("Or [" + columnName + "] = ''"))
{
newFilter = newFilter.Replace("Or [" + columnName + "] = ''", "");
mainGrid.AutoFilterHelper.FilterExpression = CorrectRowFilter(newFilter);
}
else if (newFilter.Contains("[" + columnName + "] = ''"))
{
newFilter = newFilter.Replace("[" + columnName + "] = ''", "");
mainGrid.AutoFilterHelper.FilterExpression = CorrectRowFilter(newFilter);
}
}
}
}
CurrentDistictValues[0].IsChecked = false;
CurrentListBox.Items.Refresh();
grid.Items.Refresh();
}
}
else
{
if (grid.ItemsSource is DataView)
{
var itemSource = grid.ItemsSource as DataView;
string actualValue = "";
var unquieValues = new HashSet<string>();
foreach (DataRow row in itemSource.Table.Rows)
{
var val = Convert.ToString(row[columnName]);
if (val == Convert.ToString(value))
continue;
if (!unquieValues.Contains(val))
unquieValues.Add(val);
else
continue;
if (actualValue == "")
{
actualValue = val + "'";
}
else
{
actualValue = actualValue + "," + "'" + val + "'";
}
}
actualValue = actualValue.Substring(0, actualValue.Length - 1);
ApplyFilters(grid, columnName, actualValue);
CurrentDistictValues[0].IsChecked = false;
grid.Items.Refresh();
}
else if (CollectionViewSource.GetDefaultView(grid.ItemsSource) != null)
{
ICollectionView view = CollectionViewSource.GetDefaultView(grid.ItemsSource);
var unquieValues = new HashSet<string>();
string actualValue = "";
foreach (var rowData in grid.ItemsSource)
{
var propertyValue = rowData.GetType().GetProperty(columnName);
if (propertyValue != null)
{
var data = Convert.ToString(propertyValue.GetValue(rowData, null));
if (!unquieValues.Contains(data) && data != Convert.ToString(value))
{
if (actualValue == "")
{
actualValue = data + "'";
}
else
{
actualValue = actualValue + "," + "'" + data + "'";
}
unquieValues.Add(data);
}
}
}
actualValue = actualValue.Substring(0, actualValue.Length - 1);
ApplyFilters(grid, columnName, actualValue);
CurrentDistictValues[0].IsChecked = false;
grid.Items.Refresh();
}
}
if (CurrentListBox != null)
{
if (CurrentListBox != null)
{
var clearButton = FindControls.FindChild<Button>(CurrentListBox.Parent, "btnClear");
if (clearButton != null)
{
if (CurrentDistictValues != null)
clearButton.IsEnabled = CurrentDistictValues.Count(c => c.IsChecked) > 0;
}
}
}
grid.Items.Refresh();
}
private string RemoveIsNullAndBlankFilter(string existingFilter, string columnName)
{
string newFilter = existingFilter.Trim();
//IS NULL Values
if (newFilter.Contains("Or ([" + columnName + "] IS Null)"))
{
newFilter = newFilter.Replace("Or ([" + columnName + "] IS Null)", "");
newFilter = CorrectRowFilter(newFilter);
}
else if (newFilter.Contains("([" + columnName + "] IS Null)"))
{
newFilter = newFilter.Replace("([" + columnName + "] IS Null)", "");
newFilter = CorrectRowFilter(newFilter);
}
else if (newFilter.Contains("Or [" + columnName + "] IS Null"))
{
newFilter = newFilter.Replace("Or [" + columnName + "] IS Null", "");
newFilter = CorrectRowFilter(newFilter);
}
else if (newFilter.Contains("[" + columnName + "] IS Null"))
{
newFilter = newFilter.Replace("[" + columnName + "] IS Null", "");
newFilter = CorrectRowFilter(newFilter);
}
//BLANK values
if (newFilter == null)
return null;
if (newFilter.Contains("Or ([" + columnName + "] = '')"))
{
newFilter = newFilter.Replace("Or ([" + columnName + "] = '')", "");
newFilter = CorrectRowFilter(newFilter);
}
else if (newFilter.Contains("([" + columnName + "] = '')"))
{
newFilter = newFilter.Replace("([" + columnName + "] = '')", "");
newFilter = CorrectRowFilter(newFilter);
}
else if (newFilter.Contains("Or [" + columnName + "] = ''"))
{
newFilter = newFilter.Replace("Or [" + columnName + "] = ''", "");
newFilter = CorrectRowFilter(newFilter);
}
else if (newFilter.Contains("[" + columnName + "] = ''"))
{
newFilter = newFilter.Replace("[" + columnName + "] = ''", "");
newFilter = CorrectRowFilter(newFilter);
}
else if (newFilter.IndexOf("() AND ", StringComparison.Ordinal) == 0)
{
newFilter = newFilter.Substring(7);
newFilter = CorrectRowFilter(newFilter);
}
return newFilter;
}
private string CorrectRowFilter(string exsistingFilter)
{
string newFilter = Convert.ToString(exsistingFilter);
if (string.IsNullOrEmpty(newFilter))
return null;
newFilter = exsistingFilter.Trim();
if (string.IsNullOrEmpty(newFilter))
return null;
if (newFilter.Contains(",)"))
{
newFilter = newFilter.Replace(",)", ")");
}
if (newFilter.Contains("()"))
{
newFilter = "";
}
if (newFilter.Contains("(,"))
{
newFilter = newFilter.Replace("(,", "(");
}
if (newFilter.Contains(",)"))
{
newFilter = newFilter.Replace(",)", ")");
}
if (newFilter.Contains(" AND ()"))
{
newFilter = newFilter.Replace(" AND ()", "");
}
newFilter = newFilter.Replace(exsistingFilter, newFilter);
if (newFilter.Contains("() AND "))
{
newFilter = newFilter.Replace("() AND ", "");
}
if (newFilter.IndexOf("(((", StringComparison.Ordinal) == 0)
{
newFilter = newFilter.Substring(2);
}
if (newFilter.Contains(")))"))
{
newFilter = newFilter.Replace(")))", "))");
}
if (newFilter.Contains("()"))
{
newFilter = newFilter.Replace("()", "");
}
if (newFilter.LastIndexOf(" AND ", StringComparison.Ordinal) == newFilter.Length - 5)
{
newFilter = newFilter.Substring(0, newFilter.Length - 5);
}
if (newFilter.IndexOf("((", StringComparison.Ordinal) == 0)
{
newFilter = newFilter.Substring(1);
}
newFilter = newFilter.Trim();
if (newFilter.IndexOf("Or", StringComparison.Ordinal) == 0)
{
newFilter = newFilter.Substring(3);
}
if (newFilter.LastIndexOf(" )", StringComparison.Ordinal) == newFilter.Length - 2 && newFilter.Length - 2 > 0)
{
newFilter = newFilter.Substring(0, newFilter.Length - 2) + newFilter.Substring(newFilter.Length - 1);
}
if (newFilter.LastIndexOf("AND", StringComparison.Ordinal) == newFilter.Length - 3)
{
newFilter = newFilter.Substring(0, newFilter.Length - 3);
}
if (newFilter == "( )")
newFilter = null;
switch (newFilter)
{
case "":
return null;
default:
return newFilter;
}
}
#region ICollectionView
string _filterExpression;
System.ComponentModel.ICollectionView _view;
DataTable _collectionViewDt;
// ** object model
internal string FilterExpression
{
get { return _filterExpression; }
set
{
_filterExpression = value;
UpdateFilter();
_view.Filter = null;
if (!string.IsNullOrEmpty(_filterExpression))
{
_view.Filter = FilterPredicate;
}
}
}
// ** implementation
bool FilterPredicate(object obj)
{
if (_collectionViewDt == null)
return false;
// populate the row
var row = _collectionViewDt.Rows[0];
foreach (var pi in obj.GetType().GetProperties())
{
// Bugfix: do not evaluate indexed propertiess
if (pi.GetIndexParameters().Any() == false)
{
if (pi.PropertyType.BaseType != null && pi.PropertyType.BaseType.FullName == "System.Enum")
{
var value = Convert.ToInt32(System.Enum.Parse(pi.PropertyType, System.Convert.ToString(pi.GetValue(obj, null))));
row[pi.Name] = value;
}
else
{
try
{
row[pi.Name] = pi.GetValue(obj, null);
}
catch (Exception)
{
row[pi.Name] = DBNull.Value;
}
}
}
}
bool returnValue = false;
Boolean.TryParse(Convert.ToString(row["_filter"]), out returnValue);
// compute the expression
return returnValue;
}
private string EscapeLikeValue(string value)
{
StringBuilder sb = new StringBuilder(value.Length);
for (int i = 0; i < value.Length; i++)
{
char c = value[i];
switch (c)
{
case ']':
case '[':
case '%':
case '*':
sb.Append("[").Append(c).Append("]");
break;
//case '\'':
// sb.Append("''");
// break;
default:
sb.Append(c);
break;
}
}
return sb.ToString();
}
void UpdateFilter()
{
_collectionViewDt = null;
var enumerator = _view.GetEnumerator();
enumerator.MoveNext(); // sets it to the first element
var firstElement = enumerator.Current;
if (firstElement != null && !string.IsNullOrEmpty(_filterExpression))
{
// build/rebuild data table
var dt = new DataTable();
foreach (var pi in firstElement.GetType().GetProperties())
{
dt.Columns.Add(pi.Name, Nullable.GetUnderlyingType(pi.PropertyType) ?? pi.PropertyType);
}
// add calculated column
dt.Columns.Add("_filter", typeof(bool), _filterExpression);
// create a single row for evaluating expressions
if (dt.Rows.Count == 0)
{
dt.Rows.Add(dt.NewRow());
}
// done, save table
_collectionViewDt = dt;
}
}
#endregion
}
}