Thursday 28 March 2013

How to use LIKE operator in Dataview.RowFilter for Date Time or Numaric Fields using CONVERT


How to use LIKE operator in Dataview.RowFilter for Date Time or Numaric Fields using CONVERT


The RowFilter property of the DataView allows to use flexible string similar to SQL or LINQ to easily filter rows wihtout having to iterate through them.
I had to implement a fully flexible search module for a project I’m working on. The user had to be able to perform a string search on any field displayed on the gridview. The above mentioned RowFilter method is really handy to provide such a functionality due to increased efficiency.
Assume following example:
The data table (in the database)
Field Name         Data Type  
Name                String
DateOfBirth        DateTime
Data
Name                     DOB
John                      1976-10-12
Sophie                   1990-12-30
If you want to use the RowFilter to enable flexible searching (i.e. if the user type “j” in the search textbox the search grid view would only show the record for John) you can use following code:
1
2
string SearchFor = SearchTextBox.Text;
((DataView)SearchGrid.DataContext).RowFilter = string.Concat("Name LIKE '%", SearchFor, "%'");
This will allow the above explained behaviour so if the user now enter “h” in the textbox it will show both records because both John and Sophie have the letter “h” in their names.
So what if we repeat the same and use the following code for the date of birth field?
1
2
3
// WRONG CODE
string SearchFor = SearchTextBox.Text;
((DataView)SearchGrid.DataContext).RowFilter = string.Concat("DateOfBirth LIKE '%", SearchFor, "%'");
We would expect the program to filter records similarly. However, if you enter “1990″ in the search textbox hoping it would filter Sophie, it would give you an error instead!
This is because the LIKE operator cannot work with non-charactor types.
The Solution!
We have to use a converter to convert the datetime field into a string just before the RowFilter is applied.
Here’s the code:
1
2
string SearchFor = SearchTextBox.Text;
((DataView)SearchGrid.DataContext).RowFilter = string.Concat("CONVERT(DateOfBirth, System.String) LIKE '%", SearchFor, "%'");
The Convert function will cast the datetime value into string just before the LIKE operation takes place. And since the datetime value is only temperory converted, the original data are not affected as well.
So if you add this code to the previously worked code for the Name column as described below:
1
2
3
string SearchFor = SearchTextBox.Text;
((DataView)SearchGrid.DataContext).RowFilter = string.Concat("Name LIKE '%", SearchFor, "%'");
((DataView)SearchGrid.DataContext).RowFilter = string.Concat("CONVERT(DateOfBirth, System.String) LIKE '%", SearchFor, "%'");
The Result

No comments:

Post a Comment