使用dgv的数据源(dt).DefaultView.RowFilter和连接字符串筛选dgv



由于某种原因,当我应用我的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)

你还可以做其他的改进,但这可能已经足够迈出第一步了。

最新更新