加载页面时将列数分配给转发器
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>
我正在将数据集绑定到 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>