如何根据部分匹配搜索条件跳转到DataView的一行?

时间:2015-04-09 14:40:56

标签: vb.net dataset dataview c1flexgrid

目前,我的应用程序使用表达式上的RowFilter属性来搜索DataView中的用户定义字符串。目前我的代码看起来像这样:

Public Class MyClass
   Private custView As DataView
Private Sub form_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
   dsDataSet = <"DataAccessLayer call to SQL Stored Procedure">
   custView = New DataView(dsDataSet.Tables(0))
   custView.Sort = "Column Name"
   Me.C1FlexGrid1.DataSource = custView
End Sub
Private Sub txtSearch_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles txtSearch.TextChanged
    Dim searchText As String = txtSearch.Text
    Dim expression As String = "Column Name LIKE '" + searchText + "%'"

    custView.RowFilter = expression
    Me.C1FlexGrid1.DataSource = custView
End Sub
End Class

我的目标是修改此行为,以便不会过滤掉不符合搜索结果的行,而是保留所有行,但在用户键入搜索时跳转到部分匹配的第一个实例框。如果DataView.Find()支持通配符我将被设置,但不幸的是它没有。

1 个答案:

答案 0 :(得分:1)

我提出的解决方案是使用一些迭代逻辑。但是,这是在DataView绑定的对象上完成的,而不是DataView本身。虽然可以修改此代码以完全执行此操作。

Private Sub txtSearch_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles txtSearch.TextChanged
        'Unselect all
        Me.C1FlexGrid1.Select(-1, -1, True)

        If txtSearch.Text <> "" And [column index] <> -1 Then
            'Typed text
            Dim s As String = txtSearch.Text.Trim.ToLower
            Dim column As Int32 = [column index] + 1

            'Recurse until match in first column is found
            For i As Integer = 0 To Me.C1FlexGrid1.Rows.Count - 1
                If C1FlexGrid1.GetData(i, column) <> Nothing Then
                    If C1FlexGrid1.GetData(i, column).ToString.ToLower.StartsWith(s) Then
                        Me.C1FlexGrid1.Select(i, column, True)
                        Exit Sub
                    End If
                Else

                    MsgBox("Error message", vbOKOnly, "NO MATCHES")

                    'Reset search criteria
                    Call ResetSearch()

                End If
            Next
            MsgBox("Error message", vbOKOnly, "NO MATCHES")
        End If
    End Sub