2011-06-29 87 views
0

我有以下問題。我有一個ListView從SQL表中返回數據。其中的一列看起來像「Ambient/Trance/Goa Trance/House」。在ListView中動態創建按鈕

所有我想要做的就是分析此列,併爲每個值創建按鈕,例如一個按鈕,「環境」,爲「恍惚」按鈕等

我試圖創建在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上成爲Nothing,所以按鈕不起作用。

如何解決這個問題?再次感謝!

回答

0

所以,我解決了我的問題。該解決方案並不簡單,但它是這樣的:

在ItemCreated事件我首先計算按鈕的數量,然後將其保存到ViewState,然後我創建按鈕。我必須將按鈕的數量保存到ViewState,因爲在每次回發時,e.Item.DataItem都變成Nothing。

也許有一個simplier解決方案,但我發現只有一個......

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 
1

我相信按鈕必須在頁面生命週期的後期才能創建,因此不會對事件做出響應。

您可能需要嘗試在ItemCreated事件中移動您的代碼,並使用ListView的ItemCommand事件來捕獲這些事件。另一項建議是分配(不同的)ID,以您的鏈接按鈕 - 例如

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

在情況下,你要直接連接的單擊事件處理程序按鈕,然後ID是必須的。

+0

謝謝!這幫助了我!但我還有一個問題。我在頁面上有多個ListView,我將它們動態綁定到SQLDataSources。當我做ListView.DataSource = Nothing ListView.DataBind()時,ItemCreated事件會引發錯誤。我怎樣才能避免它。順便說一下,當我按動態生成的按鈕時,它們會觸發但消失。我能用它做什麼? –

+0

對不起,我錯了。它沒有幫助。這些按鈕不會發送CommandName和CommandArguments。 –