我可以通过编程方式将多个元素插入到asp:Table中吗?

时间:2011-05-06 05:03:09

标签: c# asp.net

另请参阅相关问题can we have multiple <tbody> in same <table>?

假设我想使用asp:table:

生成下表
<table>
    <thead>
        ...stuff...
    </thead>
    <tbody class="odd">
        <th scope="tbody">CUSTOMER 1</th>
        <tr><td>#1</td><td>January</td></tr>
        <tr><td>#2</td><td>April</td></tr>
        <tr><td>#3</td><td>March</td></tr>
    </tbody>
    <tbody class="even">
        <th scope="tbody">CUSTOMER 2</th>
        <tr><td>#1</td><td>January</td></tr>
        <tr><td>#2</td><td>April</td></tr>
        <tr><td>#3</td><td>March</td></tr>
    </tbody>
    <tbody class="odd">
        <th scope="tbody">CUSTOMER 3</th>
        <tr><td>#1</td><td>January</td></tr>
        <tr><td>#2</td><td>April</td></tr>
        <tr><td>#3</td><td>March</td></tr>
    </tbody>
</table>

我可以通过编程方式构建这些<tbody> / <tr>元素吗?

我尝试过这样的事情:

var x = new HtmlGenericControl("tbody");
x.Attributes["class"] = jobNum % 2 == 0 ? "even" : "odd";
TableRow xinfoRow = buildXInfoRow(job); x.Controls.Add(xinfoRow);
TableRow xdescriptionRow = buildXDescriptionRow(job); x.Controls.Add(xdescriptionRow);
myTable.Controls.Add(x);

但这只是给我错误'Table' cannot have children of type 'HtmlGenericControl'

我可以找到一个TableRow,TableCell,TableHeaderRow,TableHeaderCell等类,但我似乎无法找到TableBody或TableHeader。我可以在页眉,正文或页脚中放置行:

descriptionRow.TableSection = TableRowSection.TableBody;

...但我似乎无法将行划分为多个不同的<tbody>元素。我已经放弃了并且使用<asp:ListView>来生成表格,但我很想知道是否可以这样做。

1 个答案:

答案 0 :(得分:1)

仅使用其属性无法增强asp:Table的{​​{1}}功能。但是我知道如何实现这三种方式:

  1. 创建一个派生自<tbody>的类,并使用您自己的逻辑覆盖其方法System.Web.UI.WebControls.Table。查看.NET Framework本机方法(RenderContents)的默认实现,以了解如何使用.NET Reflector等反汇编程序来管理它。

  2. (最难的方式)创建自己的Table.RenderContents子类(TableBody,TableBodyRow,TableBodyCell等);)

  3. 请改为使用asp:Table

  4. asp:Repeater

    或甚至使用子转发器(如果您有两个收集,可能是更好的方式 - 按月份的客户和价值)

    P.S。:通过查看您的示例,<asp:Repeater ...> <HeaderTemplate> <table> <thead> ..stuff.. </thead> <tbody class="odd"> </HeaderTemplate> <ItemTemplate> <tr> ..stuff.. </tr> </ItemTemplate> <SeparatorTemplate> <asp:PlaceHolder Visible='<%# (Container.ItemIndex + 1) % 3 %>' runat="server"> <tbody class="<%# (Container.ItemIndex + 1) % 6 > 3 ? "even" : "odd" %>"> </asp:PlaceHolder> </SeparatorTemplate> <FooterTemplate> </tbody> </table> </FooterTemplate> </asp:Repeater> 内的<th>在HTML规则方面不正确。不要在那里使用它。