Comment créer un contrôle avec une collection de contrôles enfants dans ASP.Net

J’essaie de développer un contrôle personnalisé pour asp.net qui aura le balisage suivant:

    [ List of controls... ]   

Quel type de propriété me permettra de le faire lorsque je développerai mon contrôle? (La collection d’objects étant la pièce en question).

Vous ne pouvez pas avoir d’éléments nesteds dans un contrôle utilisateur Web standard. Pour ce faire, vous devrez développer un contrôle serveur personnalisé. Pour autoriser les éléments nesteds dans un contrôle serveur personnalisé, vous devez utiliser l’atsortingbut PersistenceMode et le définir sur InnerProperty .

 ///  /// Gets the columns collection. ///  [Browsable(true)] [DesignerSerializationVisibility(DesignerSerializationVisibility.Content)] [PersistenceMode(PersistenceMode.InnerProperty)] public ItemCollection Items { get { if (itemCollection == null) { if (itemArrayList == null) { this.EnsureChildControls(); if (itemArrayList == null) itemArrayList = new ArrayList(); } itemCollection = new ItemCollection(itemArrayList); } return itemCollection; } } 

Voici un exemple d’un contrôle que j’ai créé:

Contrôle ScheduleGrid

 ///  /// Gets the columns collection. ///  [Browsable(true)] [DesignerSerializationVisibility(DesignerSerializationVisibility.Content)] [PersistenceMode(PersistenceMode.InnerProperty)] public ScheduleGridColumnCollection Columns { get { if (scheduleColumnsCollection == null) { if (scheduleColumnsArrayList == null) { this.EnsureChildControls(); if (scheduleColumnsArrayList == null) scheduleColumnsArrayList = new ArrayList(); } scheduleColumnsCollection = new ScheduleGridColumnCollection(scheduleColumnsArrayList); } return scheduleColumnsCollection; } } 

Classe ScheduleGridColumn

 #region schedule column [PersistChildren(true)] public sealed class ScheduleGridColumn : DataGridColumn, INamingContainer { #region private member variables private bool editModeEnabled; private bool aggregateColumn; private ssortingng uniqueName; private ssortingng dataFieldName; private ssortingng aggregateKey; private ssortingng dataFormatSsortingng; private ITemplate editTemplate = null; #endregion #region constructor ///  /// Initializes the GridColumn object using default values. ///  public ScheduleGridColumn() { //initialize other fields to defaults dataFieldName = Ssortingng.Empty; dataFormatSsortingng = Ssortingng.Empty; uniqueName = Ssortingng.Empty; //disable edit mode by default editModeEnabled = false; } #endregion #region properties ///  /// Gets or sets the edit template. ///  [DesignerSerializationVisibility(DesignerSerializationVisibility.Visible), PersistenceMode(PersistenceMode.InnerProperty), TemplateInstance(TemplateInstance.Single)] public ITemplate EditTemplate { get { return editTemplate; } set { editTemplate = value; } } ///  /// Gets or sets the unique name. ///  [Browsable(true)] [DesignerSerializationVisibility(DesignerSerializationVisibility.Visible)] public ssortingng UniqueName { get { return uniqueName; } set { uniqueName = value; } } ///  /// Gets or sets the name of the data field. ///  [Browsable(true)] [DesignerSerializationVisibility(DesignerSerializationVisibility.Visible)] public ssortingng DataField { get { return dataFieldName; } set { dataFieldName = value; } } ///  /// Gets or sets the format ssortingng used to format the data. ///  [Browsable(true)] [DesignerSerializationVisibility(DesignerSerializationVisibility.Visible)] public ssortingng DataFormatSsortingng { get { return dataFormatSsortingng; } set { dataFormatSsortingng = value; } } ///  /// Gets or sets a value indicating whether the item /// is in edit mode. ///  [Browsable(true)] [DesignerSerializationVisibility(DesignerSerializationVisibility.Visible)] public bool EditModeEnabled { get { return editModeEnabled; } set { editModeEnabled = value; } } ///  /// Gets or sets a value indicating whether the item should be aggregated. ///  [Browsable(true)] [DesignerSerializationVisibility(DesignerSerializationVisibility.Visible)] public bool AggregateColumn { get { return aggregateColumn; } set { aggregateColumn = value; } } ///  /// Gets or sets the aggregate key. ///  [Browsable(true)] [DesignerSerializationVisibility(DesignerSerializationVisibility.Visible)] public ssortingng AggregateKey { get { return aggregateKey; } set { aggregateKey = value; } } #endregion } #endregion 

Classe ScheduleGridColumnCollection

 #region schedule column collection [PersistChildren(true)] public sealed class ScheduleGridColumnCollection : ICollection { #region member variables private ArrayList ItemArray; private ssortingng columnGroupTitle; #endregion #region constructors public ScheduleGridColumnCollection(ArrayList items) { ItemArray = items; } #endregion #region methods ///  /// Finds the column corresponding to the data field. ///  ///  ///  public ScheduleGridColumn FindColumnDataField(ssortingng dataFieldName) { ScheduleGridColumn column = new ScheduleGridColumn(); foreach (ScheduleGridColumn item in ItemArray.Cast()) { if (item.DataField == dataFieldName) { column = item; break; } } return column; } public bool ContainsColumnWithDataField(ssortingng dataFieldName) { foreach (ScheduleGridColumn item in ItemArray.Cast()) if (item.DataField == dataFieldName) return true; return false; } ///  /// Adds an item to the collection. ///  ///  public void Add(ScheduleGridColumn item) { ItemArray.Add(item); } public void AddRange(ScheduleGridColumnCollection itemCollection) { foreach (ScheduleGridColumn item in itemCollection) ItemArray.Add(item); } ///  /// Clears all items from the collection. ///  public void Clear() { ItemArray.Clear(); } ///  /// Returns the enumerated equivalent of the collection. ///  ///  public IEnumerator GetEnumerator() { return ItemArray.GetEnumerator(); } ///  /// Copies the collection to the array parameter. ///  ///  ///  public void CopyTo(Array array, int index) { ItemArray.CopyTo(array, index); } #endregion #region properties ///  /// Gets the schedule column located at the specified index. ///  ///  ///  [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] public ScheduleGridColumn this[int index] { get { return (ScheduleGridColumn)ItemArray[index]; } } ///  /// Gets a schedule column from the collection based on a unique name. ///  ///  ///  [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] public ScheduleGridColumn this[ssortingng uniqueName] { get { ScheduleGridColumn dataColumn = null; foreach (object item in ItemArray) if (((ScheduleGridColumn)item).UniqueName == uniqueName) dataColumn = (ScheduleGridColumn)item; return dataColumn; } } ///  /// Gets the total number of items in the collection. ///  [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] public int Count { get { return ItemArray.Count; } } ///  /// Gets a value indicating whether the collection is read only. ///  [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] public bool IsReadOnly { get { return false; } } ///  /// Gets a value indicating whether the collection is synchronized. ///  [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] public bool IsSynchronized { get { return false; } } ///  /// Gets the sync root object. ///  [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] public object SyncRoot { get { return this; } } ///  /// Gets or sets the column group title. ///  [DesignerSerializationVisibility(DesignerSerializationVisibility.Visible)] [Browsable(true)] public ssortingng ColumnGroupTitle { get { return columnGroupTitle; } set { columnGroupTitle = value; } } #endregion } #endregion