开发者

Accessing listview itemtemplate from codebehind

I'm hoping to dynamically change the number of columns in my ItemTemplate of my ListView:

<asp:ListView runat="server" ID="ReportListView" DataSourceID="ReportListViewSDS">
 <LayoutTemplate>
   <table>
       <tr>
           <asp:PlaceHolder runat="server" ID="itemPlaceHolder" />
       </tr>
   </table>
 </LayoutTemplate>
 <ItemTemplate>
       <!-开发者_C百科- need to dynamically create the number of columns in the code behind 
            based on the select statement in the SelectCommand -->
 </ItemTemplate>
</asp:ListView>

Then in the code behind I've got:

 Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load

    ' Based on The Request.Form variables sent, the SQL command will 
    ' select x number of columns:
    ' SqlStatement = "SELECT " for each Request.Form values " FROM staff"
    '      example: "SELECT Fname, Lname, email, phone FROM staff"
    ' Run sql command.

    ' that all works, the question now is how do i change the ItemTemplate 
    ' so that it has the correct number of columns.  Something like this: (pseudo code)
    For each row found in sql command
       ReportListView.ItemTemplate.Add( "<tr>" )
       For each Request.Form as i
            ReportLIstView.ItemTemplate.Add( "<td>" & sqlresult(i) & "</td>" )
       Next
       ReportListView.ItemTemplate.Add( "</tr>" )
    Next
 End Sub

Maybe there's another way to go about it, but that's the only idea of got so far. asp.net newbie, any advise, very welcome! Thanks!


I think you're going to have to do this a little differently. Try something like this:

<table>
    <asp:ListView ID="ListView1" runat="server">
        <ItemTemplate>
            <tr>
               <asp:PlaceHolder Id="PlaceHolder1" runat="server" />
            </tr>
        </ItemTemplate>
    </asp:ListView>
</table>

The syntax might not be perfect, but try doing something like this in your code behind:

For Each listItem As ListViewDataItem In ListView1.Items
    Dim plc As PlaceHolder = DirectCast(listItem.FindControl("PlaceHolder1"), PlaceHolder)
    If plc IsNot Nothing Then
        For Each item As String In Request.Form
            plc.Controls.Add(New Literal(String.Format("<td>{0}</td>", item)))
        Next
    End If
Next


Another way would be to set up the ItemTemplate the same way but since you are using a databound control you might want to take advantage of the DataBound event of the listview. This syntax may not be perfect because you may be using a different collection to bind to the list (which would be done after query execution) but this should get you on the right track:

Protected Sub ReportListView_ItemDataBound(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.ListViewItemEventArgs) Handles ReportListView.ItemDataBound
    If (e.Item.ItemType = ListViewItemType.DataItem) Then
        Dim di As Data.DataRowView = e.Item.DataItem
        Dim plc As PlaceHolder = DirectCast(e.Item.FindControl("PlaceHolder1"), PlaceHolder)

        For Each c In di.Row.ItemArray
            Dim l As New Literal
            l.Text = String.Format("<td>{0}</td>", c.ToString)
            plc.Controls.Add(l)
        Next

    End If
End Sub

I would typically use a Repeater for this type of work since it is bare-bones and lightweight. You really aren't taking advantage of any of the listview features from what i see.


Using a combination of the answers I recieved this is what I got to work:

<asp:ListView runat="server" ID="ReportListView" DataSourceID="ReportListViewSDS">
 <ItemTemplate>
   <table>
       <tr>
           <asp:PlaceHolder runat="server" ID="itemPlaceHolder" />
       </tr>
   </table>
 </ItemTemplate>
</asp:ListView>

Code Behind:

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load

 ' Based on The Request.Form variables sent, the SQL command will 
 ' select x number of columns:
 ' SqlStatement = "SELECT " for each Request.Form values " FROM staff"
 '      example: "SELECT Fname, Lname, email, phone FROM staff"
 ' Run sql command.

 ' this seems to actually run the sql, and bind the results.  If i don't run the function DataBind(), it's as if the sql never runs.
 ReportListView.DataBind() 

 ' the rest of the work is done in the next function.
End Sub

Protected Sub ReportListView_ItemDataBound(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.ListViewItemEventArgs) Handles ReportListView.ItemDataBound

    If (e.Item.ItemType = ListViewItemType.DataItem) Then
        Dim plc As PlaceHolder = DirectCast(e.Item.FindControl("itemPlaceHolder"), PlaceHolder)
        Dim di As Data.DataRowView = e.Item.DataItem()

        For Each c In di.Row.ItemArray
            Dim l As New Literal
            l.Text = String.Format("<td class='customreport'>{0}</td>", c.ToString)
            plc.Controls.Add(l)
        Next

    End If
End Sub

Thanks much for the direction of the other 2 answers, that definately got me 90%, just a couple other tweaks and i was good to go. Thanks!


i use this code to hide a element in the item template

visible='<%# Eval("Abstract").ToString().Length == 0 ? false : true %>' 
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜