我想在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
的原因是我想动态生成该单元格(例如在TD
和TH
之间进行选择,或选择是否创建它。
有一种简单的方法吗?或者也许我应该创建自己的自定义控件继承HtmlTableCell
?
我注意到某些表元素的viewstate由序数(子控件集合的索引)键入,这意味着我有时也无法动态生成单元格。对此有一些一般的最佳实践吗?
我还考虑过始终创建TD,但只是隐藏它。问题是我在前一行使用rowspan
,这意味着不同的行将呈现不同数量的单元格。这是有条件的,可以在回发之间进行更改(通过启用/禁用行)。
答案 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);