由于某种原因,当我应用我的dgvBarcodes.Datasource.Defaultview.Rowfilter=strDGVBarcodesFilter时,它正在查找(列"测试"(,而不是筛选列"上的行;LongDescription=测试";。这是出乎意料的行为。如何使用.DefaultView.RowFilter根据";LongDescription=测试";?
本例中的strDGVBarcodesFilter=";LongDescription=测试";,当鼠标移到上面时,我得到的错误是";System.Data.EvaluateException:"找不到列[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
你会期望将该变量与文本"进行比较吗;测试"?当然不是,因为那里没有文字。您必须将文本用双引号括起来,以表明它是一个文本String
。如果您希望在SQL代码中使用文本(过滤器是SQLWHERE
子句(,则需要执行等效操作。如何在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)
你还可以做其他的改进,但这可能已经足够迈出第一步了。