我正在将数据集绑定到asp转发器。
<asp:Repeater id="rptDataset" runat="server">
<table>
<HeaderTemplate>
<tr>
<th>Col1</th>
<th>Col2</th>
</tr>
</HeaderTemplate>
<ItemTemplate>
<tr>
<td><%# Eval("c1") %></td>
<td><%# Eval("c2") %></td>
</tr>
</ItemTemplate>
</asp:Repeater>
现在我有不同数量的列,直到页面加载后才会知道。所以我正在修改这个标题
<HeaderTemplate>
<tr>
<th>Col1</th>
<th>Col2</th>
<% for (int i=0; i<NoOfColumn; i++){
Response.Write("<th>ColN</th>")
} % >
</tr>
</HeaderTemplate>
其中正确显示了所有列标题。
我应该修改<ItemTemplate>
什么才能显示所有列数据?
我尝试过像
这样的东西<% Response.Write("<td><%# Eval("c1") %></td>") %>
由于嵌套的&lt; %%&gt;而导致错误登录。
也试过
<% Response.Write(DataBinder.Eval(Container.DataItem, "c1")) %>
但它说容器无法解决。
答案 0 :(得分:1)
所以你有两个选择,快速黑客和适当的漂亮解决方案。
快速入侵
在字符串中创建所有必需的html并将其输出到Literal控件中。确保使用PassThrough
模式不要使用html编码:
<ItemTemplate>
<%# GetDataRow(Container.DataItem) %>
</ItemTemplate>
protected string GetDataRow(object dataItem)
{
StringBuilder output = new StringBuilder();
output.Append("<tr>");
for (int i=0; i<NoOfColumn; i++)
{
output.Append("<td>");
output.Append(DataBinder.Eval(dataItem, "c"+i));
output.Append("</td>");
}
output.Append("</tr>");
return output.ToString();
}
漂亮的解决方案
定义您自己的实施ITemplate
的自定义模板。可以找到here的完整示例。这将需要更多的工作,但是,通常情况下,漂亮的解决方案,结果将更具可读性,可维护性和可重用性。
答案 1 :(得分:0)
最后,我通过应用嵌套的Repeater解决了这个问题。
<asp:Repeater runat="server" ID="rptRow">
<ItemTemplate>
<tr>
<td><%# Eval("c1") %></td>
<td><%# Eval("c2") %></td>
<asp:Repeater runat="server" ID="rptCol">
<ItemTemplate>
<td><%# Eval("cn") %></td>
</ItemTemplate>
</asp:Repeater>
</tr>
</ItemTemplate>
</asp:Repeater>