2015-05-19 19 views
0

我将一个数据集绑定到了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>") %> 

这将导致一个错误,由于嵌套<%%>标志。

也试过

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

但该容器不能得到解决。

回答

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> 
1

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

快速劈

创建一个字符串,并将其输出的文字控制所有必要的HTML。确保使用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。这将需要更多的工作,但是,通常情况下,如果有漂亮的解决方案,结果将更具可读性,可维护性和可重用性。

+0

谢谢@Andrei。快速入侵将会起作用,但当我正在处理大型数据集时,它会太乱。我已阅读链接 - 看起来他正在分配列,这也可以使用DataGrid来完成,不是吗?但我无法找到前端如何动态显示。如我错了请纠正我。 – ydoow