如何使用`PlaceHolder`代替`HtmlTableRow`或`HtmlTableCell`?

时间:2012-07-09 13:56:19

标签: c# asp.net html

我想在ASCX文件中创建一个包含以下内容的用户控件:

...
<tr runat="server" ID="mytr">
    <td runat="server" ID="myCell1"></td>
    <asp:PlaceHolder runat="server" ID="myPlaceholder"></asp:PlaceHolder>
    <td runat="server" ID="myCell2"></td>
</tr>
...

这会产生以下错误:

  

System.Web.UI.HtmlControls.HtmlTableCellCollection必须包含项目   键入'System.Web.UI.HtmlControls.HtmlTableCell'。 'asp:PlaceHolder'是   类型为'System.Web.UI.WebControls.PlaceHolder'。

PlaceHolder的原因是我想动态生成该单元格(例如在TDTH之间进行选择,或选择是否创建它。

有一种简单的方法吗?或者也许我应该创建自己的自定义控件继承HtmlTableCell

我注意到某些表元素的viewstate由序数(子控件集合的索引)键入,这意味着我有时也无法动态生成单元格。对此有一些一般的最佳实践吗?

我还考虑过始终创建TD,但只是隐藏它。问题是我在前一行使用rowspan,这意味着不同的行将呈现不同数量的单元格。这是有条件的,可以在回发之间进行更改(通过启用/禁用行)。

4 个答案:

答案 0 :(得分:1)

您可以使用 ASP.net Table Webcontrol 动态创建表格(如果考虑从代码生成整个表格。)

http://msdn.microsoft.com/en-us/library/system.web.ui.webcontrols.table.aspx

答案 1 :(得分:1)

有几种方法可以解决这个问题。

1。runat="server"table标记中删除tr个属性。此方法的缺点是您无法从服务器端修改这些标记。您仍然可以修改任何td代码。

2. 从服务器端代码动态生成整个表。

HTML

<table runat="server" id="Table1">
</table>

C#服务器端代码

HtmlTableRow row = new HtmlTableRow();
HtmlTableCell cell = new HtmlTableCell();
cell.InnerText = "Text goes here.";
row.Cells.Add(cell);

this.Table1.Rows.Add(row);

答案 2 :(得分:0)

我设法通过制作一个简单的自定义控件来解决它:

public class HtmlTableCellPH : HtmlTableCell
{
    public HtmlTableCellPH()
    {
    }

    public HtmlTableCellPH(string tagName)
        : base(tagName)
    {
    }

    public override void RenderControl(HtmlTextWriter writer)
    {
        this.RenderChildren(writer);
    }
}

现在ascx是:

...
<tr runat="server" ID="mytr">
    <td runat="server" ID="myCell1"></td>
    <ns:HtmlTableCellPH runat="server" ID="myPlaceholder"></ns:HtmlTableCellPH>
    <td runat="server" ID="myCell2"></td>
</tr>
...

答案 3 :(得分:0)

遇到这种情况时,我使用的解决方案是将<tr>替换为<asp:literal>,然后自己编写表格行的HTML。

示例:

<asp:literal runat="server" ID="trRow" Mode="PassThrough" />
    <td runat="server" ID="myCell1"></td>
    <asp:PlaceHolder runat="server" ID="myPlaceholder"></asp:PlaceHolder>
    <td runat="server" ID="myCell2"></td>
</tr>

然后在后面的代码中

Literal trRow = (Literal)e.Item.FindControl("trRow");
// ... some code here decides on CSS class I want to use
trRow.Text = string.Format("<tr class=\"{0}\">", strCssClass);