Создание кнопок динамически в ListView - PullRequest
0 голосов
/ 29 июня 2011

У меня следующая проблема.У меня есть ListView, который возвращает данные из таблицы SQL.Один из его столбцов выглядит как «Ambient / Trance / Goa Trance / House».

Все, что я хочу сделать, - это проанализировать этот столбец и создать кнопки для каждого значения, например, кнопку «Ambient», кнопкудля "Trance" и т. д.

Я пытался создать кнопки в событии ItemDataBound следующим образом:

    Dim ListView_Albums_PlaceHolder_Artists As PlaceHolder = e.Item.FindControl("ListView_Albums_PlaceHolder_Artists")

    Dim Artists As String() = e.Item.DataItem("album_artists").ToString.Split("/")
    Dim ArtistsN As String() = e.Item.DataItem("album_artists_n").ToString.Split("/")

    Dim ListView_Albums_Literal_Artists As New Literal

    If Artists.Length = 1 Then
        ListView_Albums_Literal_Artists.Text = "Artist: "
    Else
        ListView_Albums_Literal_Artists.Text = "Artists: "
    End If

    ListView_Albums_PlaceHolder_Artists.Controls.Add(ListView_Albums_Literal_Artists)

    For Integer1 As Integer = 0 To Artists.Length - 1
        Dim ListView_Albums_LinkButton_Artist As New LinkButton
        ListView_Albums_LinkButton_Artist.Text = ArtistsN(Integer1)
        ListView_Albums_LinkButton_Artist.CommandName = "Artist"
        ListView_Albums_LinkButton_Artist.CommandArgument = Artists(Integer1)
        ListView_Albums_LinkButton_Artist.CssClass = "a-03"

        ListView_Albums_PlaceHolder_Artists.Controls.Add(ListView_Albums_LinkButton_Artist)

        Dim ListView_Albums_Literal As New Literal
        ListView_Albums_Literal.Text = ", "

        If Not Integer1 = Artists.Length - 1 Then
            ListView_Albums_PlaceHolder_Artists.Controls.Add(ListView_Albums_Literal)
        End If
    Next

Они создавались нормально, но не работали вообще.Я пытался добавить обработчик для события Click или Command, но это также не помогло.

Пожалуйста, помогите мне решить мою проблему!

Редактировать:

Как предложил мне VinayCизменил ItemDataBound на ItemCreated.Это помогло, но я столкнулся с другой проблемой: насколько я понимаю, e.Item.DataItem или, может быть, e.Item ничего не становится на PostBacks, поэтому кнопки не работают.

Как решить эту проблему?Еще раз спасибо!

Ответы [ 2 ]

1 голос
/ 29 июня 2011

Я считаю, что кнопки должны создаваться в конце жизненного цикла страницы и, следовательно, не реагировать на события.

Вы можете попробовать переместить свой код в событие ItemCreated и использовать событие ListView ItemCommand, чтобы перехватить их.Еще одно предложение - назначить (другой) идентификатор для кнопок ссылок - например,

ListView_Albums_LinkButton_Artist.ID = "A" & Artists(Integer1)

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

0 голосов
/ 30 июня 2011

Итак, я решил свою проблему. Решение не было простым, но вот оно:

В событии ItemCreated я сначала подсчитываю количество кнопок, затем сохраняю их во ViewState и только потом создаю кнопки. Мне пришлось сохранить количество кнопок в ViewState, потому что при каждой обратной передаче e.Item.DataItem становится Nothing.

Возможно, есть более простое решение, но я нашел только одно ...

Sub OnItemCreated(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.ListViewItemEventArgs)
    Dim ListView_Albums_PlaceHolder_Artists As PlaceHolder = e.Item.FindControl("ListView_Albums_PlaceHolder_Artists")

    If Not ListView_Albums_PlaceHolder_Artists Is Nothing Then
        If Not e.Item.DataItem Is Nothing Then
            ViewState("Length") = e.Item.DataItem("album_artists").ToString.Split("/").Length
        End If

        If Not ViewState("Length") Is Nothing Then
            Dim Length As Integer = ViewState("Length")

            For Integer1 As Integer = 0 To Length - 1
                Dim ListView_Albums_LinkButton_Artist As New LinkButton
                ListView_Albums_LinkButton_Artist.ID = "ListView_Albums_LinkButton_Artist_" & Integer1

                ListView_Albums_PlaceHolder_Artists.Controls.Add(ListView_Albums_LinkButton_Artist)
            Next
        End If
    End If
End Sub

Sub OnItemDataBound(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.ListViewItemEventArgs)
    Dim ListView_Albums_PlaceHolder_Artists As PlaceHolder = e.Item.FindControl("ListView_Albums_PlaceHolder_Artists")

    If Not ListView_Albums_PlaceHolder_Artists Is Nothing Then
        If Not e.Item.DataItem Is Nothing Then
            Dim Artists As String() = e.Item.DataItem("album_artists").ToString.Split("/")
            Dim Artists_N As String() = e.Item.DataItem("album_artists_n").ToString.Split("/")

            For Integer1 As Integer = 0 To Artists.Length - 1
                Dim ListView_Albums_LinkButton_Artist As LinkButton = e.Item.FindControl("ListView_Albums_LinkButton_Artist_" & Integer1)

                ListView_Albums_LinkButton_Artist.CommandArgument = Artists(Integer1)
                ListView_Albums_LinkButton_Artist.Text = Artists_N(Integer1)
                ListView_Albums_LinkButton_Artist.CssClass = "a-03"
            Next
        End If
    End If
End Sub
...