C# 自定义控件发出<;td>;加成周围环境<;tr runat=server>;导致编译错误

C# 自定义控件发出<;td>;加成周围环境<;tr runat=server>;导致编译错误,c#,html,asp.net,C#,Html,Asp.net,我有一个自定义控件,InputField,它封装了一个标签和一个文本框。控制的内容远不止这些,但详细阐述只会给这个问题增加噪音。它有一个布局属性,该属性有条件地发出标记,这样我就可以避免.aspx文件中的混乱。因此,与其 <table> <tr> <td>Name:</td> <td><asp:TextBox ... /></td> </tr> 姓名: 我会写 <table

我有一个自定义控件,
InputField
,它封装了一个
标签
和一个
文本框
。控制的内容远不止这些,但详细阐述只会给这个问题增加噪音。它有一个
布局
属性,该属性有条件地发出
<代码>标记,这样我就可以避免
.aspx
文件中的混乱。因此,与其

<table>
<tr>
    <td>Name:</td>
    <td><asp:TextBox ... /></td>
</tr>

姓名:
我会写

<table>
<tr>
    <cc:InputField Layout="TableCells" FieldLabel="Name:" ... />
</tr>

但是,如果我需要能够在code behind中访问该
,我会得到一个编译错误。标记:

<table>
<tr runat="server" id="tr1">
    <cc:InputField Layout="TableCells" FieldLabel="Name:" ... />
</tr>

生成错误:
System.Web.UI.HtmlControls.HtmlTableCellCollection必须具有“System.Web.UI.HtmlControls.HtmlTableCell”类型的项cc:InputField的类型为“ASP.customcontrols\u InputField\u ascx”。

我理解产生错误的原因。我正在寻找一种方法来更改我的
InputField
控件,这样就不会发生此错误。由于C#没有多重继承,而
InputField
是,并且可能必须是
System.Web.UI.UserControl
的子类,因此我无法将其更改为子类
HtmlTableCell

我尝试了
,然后设置
显示:无
,但我因为写了不符合我们编码标准的乱七八糟的代码而被骂


我有没有办法改进我的
InputField
类,使它可以生活在
元素中?我清楚地意识到,正确的答案很可能是“你完全错了。停止编写这样的组件!这就是为什么……”

因为这个
输入字段
类是你自己设计的,如果你想将它添加到
HtmlTableCellCollection
(tr)中,然后,您需要使其从
HtmlTableCell
继承,或者需要使用as
,并停止让控件输出
td
。真的没有其他选择了


事实上,您可能不应该将
td
作为控制输出的一部分输出,因为这会阻止它在非表上下文中使用。

避免编写
td
似乎是一件非常头痛的事情。在您的情况下,是否允许只使用CSS和JavaScript隐藏/显示行?@MikeSmithDev它封装了许多其他行为,包括一些验证程序和其他格式选项。就你而言,我正在考虑禁用发出s的功能。@BobKaufman是cc:InputField还是你提供的自定义控件?还是来自第三方库?@BrianShamblen-这就是我现在正在做的,但是其他团队成员不喜欢它。当
布局设置为
表单元格时,它有条件地发出
元素。还有其他设置,因此它可以作为TableRow、ListItem或不完全包含标记的形式发出。我收到的答案和评论证实了我的怀疑,即我对这个问题采取了不正确的方法。@BobKaufman plus,删除所有有条件添加标记的代码将大大清理您的代码。。。然后让你的标记更有意义。然后下一个家伙不必担心使用什么自定义属性来创建HTML。。。当他能写出HTML的时候。