2015-05-19 16 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