0

由于某种原因,当我应用我的 dgvBarcodes.Datasource.Defaultview.Rowfilter = strDGVBarcodesFilter 时,它正在寻找(列“Test”),而不是过滤列“LongDescription=Test”上的行。这是意想不到的行为。如何让 .DefaultView.RowFilter 根据“LongDescription=Test”过滤所有行?

此示例中的 strDGVBarcodesFilter =“LongDescription=Test”,当鼠标悬停时,我得到的错误是“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
4

1 回答 1

0

想想你在那里做什么。如果您在 VB 代码中执行此操作:

Dim someStringVariable As String

'...

If someStringVariable = Test Then

您是否希望将该变量与文字文本“Test”进行比较?当然不是,因为那里没有文字。您必须将文本用双引号括起来以表明它是文字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)

您还可以进行其他改进,但这对于第一步来说可能已经足够了。

于 2021-06-01T11:42:06.320 回答