我正在尝试动态创建列表视图。在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
答案 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。