2

我创建了一个自定义控件来实现我们在各处使用的表格。它已经工作了一段时间,现在我被要求添加一个新的列类型,它允许将任何有效的 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 TableCellwhich 。

编辑:我也尝试添加一个PlaceHolder控件并使用它ControlsCollection,但它也是空的。

private PlaceHolder _innerControl = new PlaceHolder();

[DesignerSerializationVisibility(DesignerSerializationVisibility.Visible)]
[PersistenceMode(PersistenceMode.InnerDefaultProperty)]
public virtual ControlCollection InnerMarkup { get { return _innerControl.Controls; } }
4

0 回答 0