Vb.net 使用文本框值搜索广告,并将结果作为datatable返回

Vb.net 使用文本框值搜索广告,并将结果作为datatable返回,vb.net,search,gridview,active-directory,Vb.net,Search,Gridview,Active Directory,目前,我有一个gridview绑定到一个datatable,该datatable由广告中的组填充。我需要能够添加搜索功能,以便用户可以键入组名的一部分,并使结果仅显示符合其搜索条件的组。这是我到目前为止所拥有的 <asp:TextBox ID="searchParam" runat="server"></asp:TextBox><asp:button ID="btnSearch" runat="server" Text="Search" /> <asp:

目前,我有一个gridview绑定到一个datatable,该datatable由广告中的组填充。我需要能够添加搜索功能,以便用户可以键入组名的一部分,并使结果仅显示符合其搜索条件的组。这是我到目前为止所拥有的

<asp:TextBox ID="searchParam" runat="server"></asp:TextBox><asp:button ID="btnSearch" runat="server" Text="Search" />
<asp:GridView ID="dgSearchDLs" runat="server" AutoGenerateColumns="False" DataKeyNames="cn" DataSourceID="ObjectDataSource1">
    <Columns>
        <asp:BoundField DataField="cn" HeaderText="DL Name"/>
        <asp:BoundField DataField="managedBy" HeaderText="Managed By"/>
        <asp:BoundField DataField="info" HeaderText="Notes"/>
        <asp:ButtonField ButtonType="Button" text="Add" HeaderText = "Select DL" CommandName="AddDL"  />
    </Columns>
</asp:GridView>
<asp:ObjectDataSource ID="ObjectDataSource1" runat="server" 
    SelectMethod="getCOMDLs" TypeName="NewEmployee">
</asp:ObjectDataSource>

解决方案是使用FormParameter控件传递文本字段的值,我必须设置函数中用作变量名的name(searchArray)属性:

<asp:TextBox ID="searchParam" runat="server"></asp:TextBox><asp:button ID="btnSearch" runat="server" Text="Search" />
<asp:GridView ID="dgSearchDLs" runat="server" AutoGenerateColumns="False" DataKeyNames="cn" DataSourceID="ObjectDataSource1">
<Columns>
    <asp:BoundField DataField="cn" HeaderText="DL Name"/>
    <asp:BoundField DataField="managedBy" HeaderText="Managed By"/>
    <asp:BoundField DataField="info" HeaderText="Notes"/>
    <asp:ButtonField ButtonType="Button" text="Add" HeaderText = "Select DL" CommandName="AddDL"  />
</Columns>
</asp:GridView>
<asp:ObjectDataSource ID="ObjectDataSource1" runat="server" SelectMethod="getCOMDLs" TypeName="NewEmployee">
    <asp:FormParameter FormField="searchParam" Type="String" DefaultValue="" Name="searchArray" />
</asp:ObjectDataSource>
<asp:TextBox ID="searchParam" runat="server"></asp:TextBox><asp:button ID="btnSearch" runat="server" Text="Search" />
<asp:GridView ID="dgSearchDLs" runat="server" AutoGenerateColumns="False" DataKeyNames="cn" DataSourceID="ObjectDataSource1">
<Columns>
    <asp:BoundField DataField="cn" HeaderText="DL Name"/>
    <asp:BoundField DataField="managedBy" HeaderText="Managed By"/>
    <asp:BoundField DataField="info" HeaderText="Notes"/>
    <asp:ButtonField ButtonType="Button" text="Add" HeaderText = "Select DL" CommandName="AddDL"  />
</Columns>
</asp:GridView>
<asp:ObjectDataSource ID="ObjectDataSource1" runat="server" SelectMethod="getCOMDLs" TypeName="NewEmployee">
    <asp:FormParameter FormField="searchParam" Type="String" DefaultValue="" Name="searchArray" />
</asp:ObjectDataSource>
Protected Sub btnSearch_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnSearch.Click
    Dim obj As New NewEmployee
    Dim dt As DataTable
    Dim searchStr As String = searchParam.Text
    Dim tempStrArr() As String
    Dim searchStrArr() As String = Nothing
    Dim searchStrCt = 0

    If Not searchStr Is Nothing Then
        tempStrArr = searchStr.Split(New Char() {" "c}, StringSplitOptions.RemoveEmptyEntries)
        ReDim searchStrArr(0 To tempStrArr.Length - 1)

        For i As Integer = 0 To tempStrArr.Length - 1
            If tempStrArr(i) <> "" Then
                searchStrArr(searchStrCt) = tempStrArr(i)

                searchStrCt += 1
            End If
        Next
    End If

    dt = obj.getCOMDLs(searchStrArr)
    If obj.ErrMessage = "" Then
        If dt.Rows.Count >= 0 Then
            dgSearchDLs.DataSourceID = ""
            dgSearchDLs.DataSource = dt
            dgSearchDLs.DataBind()
        End If
    End If
End Sub
 Function getCOMDLs(Byval searchArray as string()) As DataTable

Dim MySearchRoot As DirectoryEntry = New DirectoryEntry("path", "usr", "pwd")
Dim MyDirectorySearcher As New DirectorySearcher(MySearchRoot)
Dim strManagedBy As String

If Not searchArray Is Nothing Then
    Dim filter As String
    filter = "(&(objectCategory=group)(cn=DL*)(|"
    For j As Integer = 0 To searchArray.Length - 1
        filter = filter & "(cn=*" & searchArray(j).Trim & "*)"
    Next
    filter = filter & "))"
    MyDirectorySearcher.Filter = (filter)
Else
    MyDirectorySearcher.Filter = ("(&(objectCategory=group)(|(name=dl*)))")
End If


MyDirectorySearcher.SearchScope = SearchScope.Subtree
MyDirectorySearcher.PropertiesToLoad.Add("cn")
MyDirectorySearcher.PropertiesToLoad.Add("ManagedBy")
MyDirectorySearcher.PropertiesToLoad.Add("info")
MyDirectorySearcher.Sort.Direction = System.DirectoryServices.SortDirection.Ascending
MyDirectorySearcher.Sort.PropertyName = "cn"

Dim MySearchResult As SearchResultCollection = MyDirectorySearcher.FindAll()

Dim myTable As New DataTable("Results")
Dim colName As String
Dim i As Integer

For Each colName In MyDirectorySearcher.PropertiesToLoad
    myTable.Columns.Add(colName, GetType(System.String))
Next

Dim result As SearchResult

For Each result In MySearchResult
    Dim dr As DataRow = myTable.NewRow()
    For Each colName In MyDirectorySearcher.PropertiesToLoad
        If result.Properties.Contains(colName) Then
            If colName = "ManagedBy" Then
                strManagedBy = CStr(result.Properties(colName)(0))
                i = strManagedBy.IndexOf(",")
                strManagedBy = strManagedBy.Substring(3, i - 3)
                dr(colName) = strManagedBy
            Else
                dr(colName) = CStr(result.Properties(colName)(0))
            End If
        Else
            dr(colName) = ""
        End If
    Next
    myTable.Rows.Add(dr)
Next
Return myTable
End Function