2011-06-29 89 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。 –