使用DataList显示搜索结果

Using DataList to display search results

我正在使用数据列表显示搜索结果,例如我正在检索这个字段示例

我正在使用相应标签中的 Text='<%# Eval("field") %>' 检索名称和描述,并使用像这样的隐藏代码检索类别和用户

Dim CategoryLabel As Label = DirectCast(DataList1.Items(0).FindControl("CategoryLabel"), Label)
CategoryLabel.Text = DirectCast(dt2.Rows(0)(0), String)
Dim UserLabel As Label = DirectCast(DataList1.Items(0).FindControl("UserLabel"), Label)
UserLabel.Text = DirectCast(dt2.Rows(0)(1), String)

如您所见,这仅适用于第一个项目,但项目的其余部分显示空白。 使用这种方法的原因是我将用户和类别的值作为外键 (ID'S) 存储到不同的表,而不是我将数据列表绑定到它的表,并且我想显示文本而不是 ID 号搜索结果。我怎样才能使这两个标签(类别和用户)以与 Eval.

类似的方式填充

P.S。所有四个标签都在一个 <ItemTemplate>

完整代码

  If (con.State = ConnectionState.Closed) Then
        con.Open()
    End If
    Dim command As SqlDataAdapter
    command = New SqlDataAdapter("select * FROM Lostitem WHERE city=@city AND datelost=@datelost AND (name Like '%' + @name + '%' OR name Like '%' + '""' + '%') ", con)
    Dim ide2 As Integer = ddlCities.SelectedValue
    command.SelectCommand.Parameters.AddWithValue("@City", ide2)
    command.SelectCommand.Parameters.AddWithValue("@datelost", TextBox1.Text)
    command.SelectCommand.Parameters.AddWithValue("@name", TextBox2.Text)
    Dim DetailsAdapter2 As SqlDataAdapter

    Dim dt1 As New DataTable

    command.Fill(dt1)
    DataList1.DataSource = dt1
    DataList1.DataBind()
    Dim rowcount As Integer = dt1.Rows.Count
    Dim idd As Integer
    For row = 0 To rowcount - 1
        idd = dt1.Rows(row)(0)



        DetailsAdapter2 = New SqlDataAdapter(" select Category.subcategory, Users.username from [Category]  JOIN [LostItem] ON (Category.CategoryID = LostItem.CategoryID) JOIN [Users] ON (LostItem.[User] = Users.[userid] ) WHERE (LostItem.LostId=" & idd & "    ) ", con)
        Dim dt2 As New DataTable

        DetailsAdapter2.Fill(dt2)
        Dim CategoryLabel As Label = DirectCast(DataList1.Items(0).FindControl("CategoryLabel"), Label)
        CategoryLabel.Text = DirectCast(dt2.Rows(0)(0), String)
        Dim UserLabel As Label = DirectCast(DataList1.Items(0).FindControl("UserLabel"), Label)
        UserLabel.Text = DirectCast(dt2.Rows(0)(1), String)

    Next
    con.Close()
    ResultPanel.Style.Add("display", "block")

我为 dt2 添加了一个循环。我不熟悉 vb 代码。所以请检查语法。

For row = 0 To rowcount - 1
    idd = dt1.Rows(row)(0)



    DetailsAdapter2 = New SqlDataAdapter(" select Category.subcategory, Users.username from [Category]  JOIN [LostItem] ON (Category.CategoryID = LostItem.CategoryID) JOIN [Users] ON (LostItem.[User] = Users.[userid] ) WHERE (LostItem.LostId=" & idd & "    ) ", con)
    Dim dt2 As New DataTable

    DetailsAdapter2.Fill(dt2)

 Dim rowcount1 As Integer = dt2.Rows.Count
 For row1 = 0 To rowcount1 - 1


    Dim CategoryLabel As Label = DirectCast(DataList1.Items(0).FindControl("CategoryLabel"), Label)
    CategoryLabel.Text = DirectCast(dt2.Rows(row1)(0), String)
    Dim UserLabel As Label = DirectCast(DataList1.Items(0).FindControl("UserLabel"), Label)
    UserLabel.Text = DirectCast(dt2.Rows(row1)(1), String)
 Next
Next
con.Close()
ResultPanel.Style.Add("display", "block")

像这样更改查询

SELECT CATEGORY.SUBCATEGORY, USERS.USERNAME 
           FROM [CATEGORY]  
           JOIN [LOSTITEM] ON (CATEGORY.CATEGORYID = LOSTITEM.CATEGORYID) 
           JOIN [USERS] ON LOSTITEM.[USER] = USERS.[USERID] 
           WHERE [LOSTITEM].CITY=@CITY AND [LOSTITEM].DATELOST=@DATELOST AND ([LOSTITEM].NAME LIKE '%' + @NAME + '%' OR [LOSTITEM].NAME LIKE '%' + '""' + '%'

您将获得一个新的数据集

 DataList1.DataSource = dt1
 DataList1.DataBind()

在设计器页面中

 <asp:DataList id="DataList1" runat="server">

<HeaderTemplate>
 Your Header
</HeaderTemplate>
<ItemTemplate>

<%#Container.DataItem("subcategory")%> -
$<%#Container.DataItem("username ")%>
 </ItemTemplate>

<FooterTemplate>
Footer comes here
</FooterTemplate>

</asp:DataList>