动态更改listview LayoutTemplate中的标题单元格数

时间:2011-08-11 17:30:43

标签: asp.net vb.net listview

我正在尝试动态创建列表视图。在reports.aspx上,用户选择了一堆复选框。在下一页上,用户可以看到reports.aspx,并且应该看到一个表格,其中包含所选复选框的列。我的想法是创建一个列表视图,然后动态更改LayoutTemplate的标题行,然后根据选择的列更改select语句。这就是我所拥有的:

<asp:ListView runat="server" ID="ReportListView" DataSourceID="ReportListViewSDS">
<LayoutTemplate runat="server">
 <table  runat="server">
    <tr runat="server">
    <%
    ' Doesn't work because code blocks (<%%>) aren's allowed inside <LayoutTemplate> blocks
    'For Each i As String In Request.Form
                'Response.Write("<th>" & Request.Form(i) & "</th>")
    'Next
     %>
    </tr>
 </table>
   <asp:PlaceHolder runat="server" ID="itemPlaceHolder" />
</LayoutTemplate>
...

问题是这不起作用,因为我不能在LayoutTemplate中放置代码块(&lt; %%&gt;)。有没有办法在后面的代码中编辑LayoutTemplate,或者循环使用Request.Form vars并用它构建表头行的另一种方法?

感谢您的任何建议/指导! -Russ

3 个答案:

答案 0 :(得分:1)

尝试使用ItemTemplate作为绑定语法而不是布局模板。我相信布局模板严格用于布局。

此外,您似乎正在使用经典的ASP代码块。 ASP.NET代码块如下所示:

对于数据绑定:

<%# Eval("<COLUMN NAME>")%>

对于不涉及数据绑定的其他情况:

<%= Request.QueryString["Hello"] %>

答案 1 :(得分:1)

由于控件已经是服务器端控件,请尝试给出和id,然后在预渲染时修改标头:

<asp:ListView runat="server" ID="ReportListView" DataSourceID="ReportListViewSDS">
<LayoutTemplate runat="server">
 <table runat="server">
    <tr id='trCustomHeader" runat="server">

然后在你的代码中,将这个逻辑附加到listview的预渲染

ReportListView_PreRender(...)
{
    TableRow tr = ReportListView.FindControl("trCustomerHeader");
    TableCell tempCell = new TableCell();
    tempCell.Text = ...
    tr.Cells.Add(tempCell);
}

答案 2 :(得分:0)

我刚刚在listview之外的页面上创建了一个单独的表,这是一种简单的方法。

 <asp:Table ID="HeaderTable" runat="server">
      <asp:TableHeaderRow ID="HeaderTableHeaderRow" runat="server" />
 </asp:Table>

 <asp:ListView ...>
     ...
 </asp:ListView>

然后在后面的代码中:

   For Each i As String In Request.Form
        If i.IndexOf("checkbox_") = 0 Then
            Dim c As New TableHeaderCell()
            Dim l As New LinkButton()
            l.Text = i.Substring(Len("checkbox_"))
            c.Controls.Add(l)
            c.CssClass = "customreport"
            HeaderTableHeaderRow.Cells.Add(c)
        End If
    Next

非常简单。所以我根本不必使用LayoutTemplate。