ADO.NET DataTable offers handy
RowFilter property (via its
DefaultView object), for example to filter by some string value and display filtered data in a grid a code like this is used:
odtMyData.DefaultView.RowFilter = "Field = 'value'" odgDataGrid.DataSource = odtMyData odgDataGrid.DataBind()
where odtMyData is a DataTable object and odgDataGrid is a Data Grid.
This works well, but what if you need preprocess data in the DataTable prior comparing it to the filter value – what if you need to apply a user-defined function to it? In my case I had a VB function called
ProcessTags which stripped HTML tags from a string, so for example strings like this:
<a href="http://someurl">This is a sample text</a>
<span style="color:red">This is a </span><label>sample text</label>
would be converted into the same text
This is a sample text
So I needed to create condition that would return DataTable rows with that have both HTML values by comparing to
"This is a sample text".
RowFilter‘s syntax is pretty poor and external function cannot be used, so something like
odtMyData.DefaultView.RowFilter = "ProcessTags(Field) = 'This is a sample text'" odgDataGrid.DataSource = odtMyData odgDataGrid.DataBind()
would throw an error.
Enter LINQ. Using
AsEnumerable DataTable extension and its
WHERE clause you can use your own comparing function. First let’s define the function: it will accept a DataRow and string to compare its Field value to. The function will return
TRUE if row satisfies the condition
Function FilterDataRows(i_oRow As DataRow, i_sCompareString as string) as Boolean Return ProcessTags(i_oRow("Field")) = i_sCompareString End Function
Since this function is a normal VB.NET function, I can use my own tag-stripping function
ProcessTags in the comparasion operation. Now the only thing remains is to apply this to filter the DataTable:
odgDataGrid.DataSource = odtMyData.AsEnumerable.Where(Function(dr As DataRow) _ FilterDataRows(dr, "This is a sample text")).AsDataView odgDataGrid.DataBind()
There you have it.
WHERE clause will call
FilterDataRows function for every row in the DataTable which in turn perform comparasing using any logic limited only by your imagination and the result converted to DataView is bound to the DataGrid, displaying only filtered rows.
In the next post I will demonstrate how to use this technique to take filtering of Infragistics UltraWebGrid completely into your own hands, leaving nothing to chance.