あらゆる場所で使用するテーブルを実装するためのカスタム コントロールを作成しました。しばらくの間正常に動作していましたが、有効な 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; } }