加载页面时将列数分配给转发器

Allocate number of columns to repeater when the page is loaded

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

现在我有不同数量的列,只有在页面加载后才能知道。所以我正在修改 header 这样的

<HeaderTemplate>
<tr>
<th>Col1</th>
<th>Col2</th>
<% for (int i=0; i<NoOfColumn; i++){ 
Response.Write("<th>ColN</th>")
} % >
</tr>
</HeaderTemplate>

它正确显示了所有列 headers。

我应该修改什么 <ItemTemplate> 才能显示所有列数据?

我试过

<% Response.Write("<td><%# Eval("c1") %></td>") %> 

由于嵌套的 <% %> 符号会导致错误。

也尝试过

<% Response.Write(DataBinder.Eval(Container.DataItem, "c1")) %> 

但是说Container无法解析。

所以你有两个选择,快速破解和适当的漂亮解决方案。

快速破解

在字符串中创建所有必需的 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 中找到有关如何完成此操作的完整示例。这将需要更多的工作,但是,正如漂亮的解决方案通常的情况一样,结果将更具可读性、可维护性和可重用性。

最后我通过应用嵌套的 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>