问题描述
出于某种原因,当我应用我的 dgvBarcodes.Datasource.defaultview.Rowfilter = strDGVBarcodesFilter 时,它正在寻找(“Test”列),而不是过滤“LongDescription=Test”列上的行。这是意料之外的行为。如何让 .defaultview.RowFilter 根据“LongDescription=Test”过滤所有行?
本例中的 strDGVBarcodesFilter = "LongDescription=Test",当鼠标悬停时,我得到的错误是 "System.Data.EvaluateException: 'Cannot find column [test].'"
事件处理程序:
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
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
解决方法
想想你在那里做什么。如果您在 VB 代码中执行此操作:
Dim someStringVariable As String
'...
If someStringVariable = Test Then
您是否希望将该变量与文字文本“Test”进行比较?当然不是,因为那里没有文字。您必须用双引号将文本括起来以表明它是文字 String
。如果您希望在 SQL 代码中使用文字文本(过滤器是 SQL WHERE
子句),那么您需要执行等效操作。如何在 SQL 代码中表示文字文本?带单引号。
这是做您想做的事情的正确方法:
strLongDescriptionFilter = $"LongDescription = '{strLongDescription}'"
和:
Dim criteria As New List(Of String)
If Not String.IsNullOrWhitespace(strFilterComponent1) Then
criteria.Add(strFilterComponent1)
End If
'Etc.
Return String.Join(" AND ",criteria)
您还可以进行其他改进,但这对于第一步来说可能已经足够了。