我有一个自定义控件InputField
,它封装了Label
和TextBox
。对比控制更多,但精心设计只会给这个问题增加噪音。它具有Layout
属性,有条件地发出<td>
... </td>
标记,因此我可以避免在.aspx
文件中出现混乱。所以,而不是
<table>
<tr>
<td>Name:</td>
<td><asp:TextBox ... /></td>
</tr>
我可以写
<table>
<tr>
<cc:InputField Layout="TableCells" FieldLabel="Name:" ... />
</tr>
但是,如果我需要能够在后面的代码中访问<tr>
,我会收到编译错误。标记:
<table>
<tr runat="server" id="tr1">
<cc:InputField Layout="TableCells" FieldLabel="Name:" ... />
</tr>
生成错误:System.Web.UI.HtmlControls.HtmlTableCellCollection must have items of type 'System.Web.UI.HtmlControls.HtmlTableCell'. 'cc:InputField' is of type 'ASP.customcontrols_inputfield_ascx'.
我理解为什么正在生成错误。我正在寻找的是一种更改InputField
控件的方法,因此不会发生此错误。由于C#没有多重继承,并且InputField
可能是System.Web.UI.UserControl
的子类,因此我无法将其更改为子类HtmlTableCell
。
我尝试<tr id="tr1">
然后设置display: none
但是我因为编写了不符合我们编码标准的kludgy代码而大喊大叫。
我有没有办法改进我的InputField
课程,以便它可以在<tr runat="server">
元素中生活?我敏锐地意识到正确的答案很可能是“你完全错了。停止写这样的组件!这就是为什么......”
答案 0 :(得分:1)
由于此InputField
类是您自己设计的,如果您想将其添加到HtmlTableCellCollection
(tr),那么您需要将其从HtmlTableCell
继承,或者您需要使用<td><cc:InputField... /></td>
,并停止让控件输出td
。确实没有其他选择。
事实上,您可能不应该将td
作为控件输出的一部分输出,因为这会阻止它在非表上下文中使用。