我创建了一个自定义控件来实现我们在各处使用的表格。它已经工作了一段时间,现在我被要求添加一个新的列类型,它允许将任何有效的 asp.net 标记放入其中,并且该标记将在该表列中呈现。
我创建了以下类:
[PersistChildren(false), ParseChildren(true)]
public class UserDefinedMarkupColumn : GridColumnBase
{
private Collection<WebControl> _innerMarkup = new Collection<WebControl>();
[DesignerSerializationVisibility(DesignerSerializationVisibility.Visible)]
[PersistenceMode(PersistenceMode.InnerProperty)]
public virtual Collection<WebControl> InnerMarkup { get { return _innerMarkup; } }
public override System.Web.UI.WebControls.TableCell CreateCell(object dataSourceObject, GridColumnBase col, out CustomGridRow extraRow, Action<object, System.Web.UI.WebControls.CommandEventArgs> handler, bool isMobileLayout = false)
{
TableCell newCell = new TableCell();
foreach (var ctrl in _innerMarkup)
{
newCell.Controls.Add(ctrl);
}
extraRow = null;
return newCell;
}
}
以及该列的标记:
<CustomGrid:UserDefinedMarkupColumn ID="markup" HeaderText="Some Markup">
<InnerMarkup>
<asp:TextBox runat="server" />
</InnerMarkup>
</CustomGrid:UserDefinedMarkupColumn>
问题是当我点击集合时总是空CreateCell
的。_innerMarkup
我看到几个使用 a 的示例,ControlsCollection
但问题是它GridColumnBase
不继承自Control
,它创建了 a TableCell
which 。
编辑:我也尝试添加一个PlaceHolder
控件并使用它ControlsCollection
,但它也是空的。
private PlaceHolder _innerControl = new PlaceHolder();
[DesignerSerializationVisibility(DesignerSerializationVisibility.Visible)]
[PersistenceMode(PersistenceMode.InnerDefaultProperty)]
public virtual ControlCollection InnerMarkup { get { return _innerControl.Controls; } }