Reputation: 1
For some reason when I apply my dgvBarcodes.Datasource.Defaultview.Rowfilter = strDGVBarcodesFilter it's looking for (column "Test"), instead of filtering the rows on column "LongDescription=Test". This is unexpected behaviour. How do I get the .DefaultView.RowFilter to filter all rows based on "LongDescription=Test"?
the strDGVBarcodesFilter in this example = "LongDescription=Test", when moused over, and the error I'm getting is "System.Data.EvaluateException: 'Cannot find column [test].'"
Event handler:
If txtLongDescription2.Text IsNot Nothing Then Dim strLongDescription As String = txtLongDescription2.Text Dim strLongDescriptionFilter As String = "" If strLongDescription = "" Then strLongDescriptionFilter = "" Else strLongDescriptionFilter = "LongDescription=" & strLongDescription End If Dim strDGVBarcodesFilter As String = fnBuildFilterString(strMainBrandFilter, strSubBrandFilter, strLongDescriptionFilter) dgvBarcodes.DataSource.DefaultView.Rowfilter = strDGVBarcodesFilter End If
Filter string builder function;
Private Function fnBuildFilterString(strFilterComponent1 As String, strFilterComponent2 As String, Optional strFilterComponent3 As String = "", Optional strFilterComponent4 As String = "", Optional strFilterComponent5 As String = "") As String
'Essentially it builds this; strMainFilter = strFilterComponent1 & " AND " & strFilterComponent2 & " AND " & strFilterComponent3 & " AND " & strFilterComponent4 & " AND " & strFilterComponent5
Dim strMainFilter As String = "" 'Reset the masterfilter string to be empty
If strFilterComponent1 <> "" Then 'If the filter component isn't empty
If strMainFilter = "" Then 'And if the masterfilter is empty
strMainFilter = strFilterComponent1 'Adds the filter component to the masterfilter string
Else 'The masterfilter isn't empty
strMainFilter &= " AND " & strFilterComponent1 'then it adds " AND " &field to the masterfilter string
End If
Else 'Filter component is empty, do nothing
End If 'check next component
If strFilterComponent2 <> "" Then 'If the filter component isn't empty
If strMainFilter <> "" Then 'And if the masterfilter isn't empty
strMainFilter &= " AND " & strFilterComponent2 'then it adds " AND " &field to the masterfilter string
Else 'The masterfilter is empty
strMainFilter = strFilterComponent2 'Adds the filter component to the masterfilter string
End If
Else 'Filter component is empty, do nothing
End If 'check next component
If strFilterComponent3 <> "" Then 'If the filter component isn't empty
If strMainFilter <> "" Then 'And if the masterfilter isn't empty
strMainFilter &= " AND " & strFilterComponent3 'then it adds " AND " &field to the masterfilter string
Else 'The masterfilter is empty
strMainFilter = strFilterComponent3 'Adds the filter component to the masterfilter string
End If
Else 'Filter component is empty, do nothing
End If 'check next component
If strFilterComponent4 <> "" Then 'If the filter component isn't empty
If strMainFilter <> "" Then 'And if the masterfilter isn't empty
strMainFilter &= " AND " & strFilterComponent4 'then it adds " AND " &field to the masterfilter string
Else 'The masterfilter is empty
strMainFilter = strFilterComponent4 'Adds the filter component to the masterfilter string
End If
Else 'Filter component is empty, do nothing
End If 'check next component
If strFilterComponent5 <> "" Then 'If the filter component isn't empty
If strMainFilter <> "" Then 'And if the masterfilter isn't empty
strMainFilter &= " AND " & strFilterComponent5 'then it adds " AND " &field to the masterfilter string
Else 'The masterfilter is empty
strMainFilter = strFilterComponent5 'Adds the filter component to the masterfilter string
End If
Else 'Filter component is empty, do nothing
End If 'check next component
Return strMainFilter
End Function
Upvotes: 0
Views: 197
Reputation: 54417
Think about what you're doing there. If you did this in your VB code:
Dim someStringVariable As String
'...
If someStringVariable = Test Then
would you expect that to compare that variable to the literal text "Test"? Of course not, because there's no literal text there. You have to wrap text in double-quotes to indicate that it's a literal String
. If you expect to use literal text in your SQL code (a filter is a SQL WHERE
clause) then you need to do the equivalent. How do you denote literal text in SQL code? With single-quotes.
Here's the proper way to do what you want to do:
strLongDescriptionFilter = $"LongDescription = '{strLongDescription}'"
and:
Dim criteria As New List(Of String)
If Not String.IsNullOrWhitespace(strFilterComponent1) Then
criteria.Add(strFilterComponent1)
End If
'Etc.
Return String.Join(" AND ", criteria)
There are other improvements you could make to but that's probably enough for a first step.
Upvotes: 0