2

我想在 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是我想动态生成该单元格(例如在 and 之间进行选择TDTH或者选择是否创建它。

是否有捷径可寻?或者也许我应该创建我自己的继承的自定义控件HtmlTableCell

我注意到某些表格元素的视图状态由序号(子控件集合的索引)键控,这意味着我有时也无法在我期望的情况下动态生成单元格。在这方面有一些一般的最佳实践吗?

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

4

4 回答 4

1

You can use ASP.net Table Webcontrol for creating your table dynamically (if you consider of generating whole table from your code.)

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

于 2012-07-09T14:10:08.240 回答
1

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

1.去掉and标签的runat="server"属性。这种方法的缺点是您将无法从服务器端修改这些标签。不过,您仍然可以修改任何标签。tabletrtd

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);
于 2012-07-09T14:18:22.337 回答
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>
...
于 2012-07-09T14:25:08.340 回答
0

当我遇到这个问题时,我使用的解决方案是<tr>用 an替换<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);
于 2018-12-12T17:47:58.117 回答