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を使用したサンプルをいくつか見ましたControlsCollectionが、問題は がGridColumnBaseから継承されずControl、継承する が作成されるTableCellことです。

編集:私もPlaceHolderコントロールを追加してそれを使用しようとしましControlsCollectionたが、それも空です。

private PlaceHolder _innerControl = new PlaceHolder();

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

0 に答える 0