2011-06-29 7 views
0

次の問題があります。私はSQLテーブルからデータを返すListViewを持っています。その列の1つは「Ambient/Trance/Goa Trance/House」のように見えます。リストビューで動的にボタンを作成する

私がやりたいすべてが「周囲」、「トランス」のボタンのボタンこの列を解析し、各値のためのボタンを作成し、例えばある、など

私は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イベントに対してHandlerを追加しようとしましたが、それも役に立たなかった。

私の問題を解決するのを手伝ってください!

編集:

VinayC私はItemCreatedにItemDataBoundを変更示唆したように。これは役に立ちましたが、私は別の問題に直面しました.e.Item.DataItemまたはe.ItemがPostBacksのNothingになってボタンが機能しないことを理解する限り、

この問題を解決するにはどうすればよいですか?もう一度ありがとう!

答えて

0

私は私の問題を解決しました。解決策は単純ではありませんでしたが、ここにあります:

In ItemCreatedイベントでは、最初にボタンの数を数え、ViewStateに保存してからボタンを作成します。すべてのポストバックでe.Item.DataItemがNothingになるため、ViewStateにボタンの数を保存する必要がありました。

はたぶんsimplierソリューションがありますが、私はそれだけで1 ...

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

申し訳ありませんが、私は間違っていました。それは助けになりませんでした。ボタンはCommandNamesとCommandArgumentsを送信しません。 –

関連する問題