在加载页面时为重发器分配列数

时间:2015-05-19 09:28:00

标签: asp.net dataset

我正在将数据集绑定到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")) %> 

但它说容器无法解决。

2 个答案:

答案 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>