Member 14228878 Ответов: 1

Циклическое прохождение через datalist ASP.NET


Я использую datalist для отображения результатов поиска, например, я извлекаю этот образец полей в этот образ

Я извлекаю имя и описание, используя [Text='<%# Eval("field") %>'] в соответствующих метках, а также извлекаю категорию и пользователя, используя код позади них

Это прекрасно работает только для первого элемента, как вы видите, но остальная часть элемента показывает пробелы. Причина использования этого подхода заключается в том, что я храню значения пользователя и категорий в виде внешних ключей (идентификаторов) в разных таблицах, отличных от той, к которой я привязываю datalist, и хочу отображать тексты вместо идентификаторов в результатах поиска. Как я могу сделать так, чтобы эти две метки (категория и пользователь) были заполнены таким же образом, как и те, что имеют Eval.

P. S. Все четыре метки в одном &ЛТ;свойства itemtemplate&ГТ;

Что я уже пробовал:

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

полный код:

< 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()
        If Not Me.Page.User.Identity.IsAuthenticated Then
            Dim ClaimButton As Button = DirectCast(DataList1.Items(0).FindControl("ClaimButton"), Button)
            ClaimButton.Visible = False
        End If
        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 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

1 Ответов

Рейтинг:
2

Vincent Maverick Durano

Во-первых, добавление значений из ваших входных данных в ваш SQL-оператор-это большое НЕТ-НЕТ, так как это может привести вас к атаке SQL-инъекций. Прочитай: Защитите свои данные: предотвратите SQL-инъекцию[^]

Во-вторых, пожалуйста, используйте отладчик, чтобы выяснить, что пошло не так с вашей логикой кода. Вам просто нужно установить точку останова и войти в свой код, чтобы увидеть, что там происходит.

В-третьих, я не специалист по VB, но, глядя на ваш код, кажется, что вы всегда перезаписываете первые элементы своего DataList. Не могли бы вы попробовать сделать что-то подобное вместо этого:

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



То, что я там изменил, это просто обновление DataList Item значение индекса до row1 вместо 0.