2011-10-19 11 views
5

Sto cercando di sviluppare un controllo personalizzato per asp.net che avrà il seguente markup:Come faccio un controllo con una collezione controllo figlio in ASP.Net

<bk:ControlMenu ID="cmTest" runat="server" Width="400px">    
    <Items> 
     <asp:Textbox> 
     <asp:Checkbox> 
     [ List of controls... ] 
    </Items> 
</bk:ControlMenu> 

Che tipo di proprietà sarà permettimi di farlo quando sto sviluppando il mio controllo? (La collezione di articoli è la parte in questione).

risposta

6

Non è possibile avere elementi nidificati in un controllo utente Web standard. Avrai bisogno di sviluppare un controllo server personalizzato per ottenere ciò. Per consentire gli elementi nidificati in un controllo server personalizzato, è necessario utilizzare l'attributo PersistenceMode e impostarlo su InnerProperty.

/// <summary> 
/// Gets the columns collection. 
/// </summary> 
[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; 
    } 
} 

Ecco un esempio da un controllo che ho creato:

controllo ScheduleGrid

/// <summary> 
/// Gets the columns collection. 
/// </summary> 
[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 string uniqueName; 
    private string dataFieldName; 
    private string aggregateKey; 
    private string dataFormatString; 

    private ITemplate editTemplate = null; 

    #endregion 

    #region constructor 

    /// <summary> 
    /// Initializes the GridColumn object using default values. 
    /// </summary> 
    public ScheduleGridColumn() 
    { 
     //initialize other fields to defaults 
     dataFieldName = String.Empty; 
     dataFormatString = String.Empty; 
     uniqueName = String.Empty; 

     //disable edit mode by default 
     editModeEnabled = false; 
    } 

    #endregion 

    #region properties 

    /// <summary> 
    /// Gets or sets the edit template. 
    /// </summary>  
    [DesignerSerializationVisibility(DesignerSerializationVisibility.Visible), 
    PersistenceMode(PersistenceMode.InnerProperty), 
    TemplateInstance(TemplateInstance.Single)] 
    public ITemplate EditTemplate 
    { 
     get 
     { 
      return editTemplate; 
     } 
     set 
     { 
      editTemplate = value; 
     } 
    } 

    /// <summary> 
    /// Gets or sets the unique name. 
    /// </summary> 
    [Browsable(true)] 
    [DesignerSerializationVisibility(DesignerSerializationVisibility.Visible)] 
    public string UniqueName 
    { 
     get 
     { 
      return uniqueName; 
     } 
     set 
     { 
      uniqueName = value; 
     } 
    } 

    /// <summary> 
    /// Gets or sets the name of the data field. 
    /// </summary> 
    [Browsable(true)] 
    [DesignerSerializationVisibility(DesignerSerializationVisibility.Visible)] 
    public string DataField 
    { 
     get 
     { 
      return dataFieldName; 
     } 
     set 
     { 
      dataFieldName = value; 
     } 
    } 

    /// <summary> 
    /// Gets or sets the format string used to format the data. 
    /// </summary> 
    [Browsable(true)] 
    [DesignerSerializationVisibility(DesignerSerializationVisibility.Visible)] 
    public string DataFormatString 
    { 
     get 
     { 
      return dataFormatString; 
     } 
     set 
     { 
      dataFormatString = value; 
     } 
    } 

    /// <summary> 
    /// Gets or sets a value indicating whether the item 
    /// is in edit mode. 
    /// </summary> 
    [Browsable(true)] 
    [DesignerSerializationVisibility(DesignerSerializationVisibility.Visible)] 
    public bool EditModeEnabled 
    { 
     get 
     { 
      return editModeEnabled; 
     } 
     set 
     { 
      editModeEnabled = value; 
     } 
    } 

    /// <summary> 
    /// Gets or sets a value indicating whether the item should be aggregated. 
    /// </summary> 
    [Browsable(true)] 
    [DesignerSerializationVisibility(DesignerSerializationVisibility.Visible)] 
    public bool AggregateColumn 
    { 
     get 
     { 
      return aggregateColumn; 
     } 
     set 
     { 
      aggregateColumn = value; 
     } 
    } 

    /// <summary> 
    /// Gets or sets the aggregate key. 
    /// </summary> 
    [Browsable(true)] 
    [DesignerSerializationVisibility(DesignerSerializationVisibility.Visible)] 
    public string AggregateKey 
    { 
     get 
     { 
      return aggregateKey; 
     } 
     set 
     { 
      aggregateKey = value; 
     } 
    } 

    #endregion 
} 

#endregion 

ScheduleGridColumnCollection classe

#region schedule column collection 

[PersistChildren(true)] 
public sealed class ScheduleGridColumnCollection : ICollection 
{ 
    #region member variables 

    private ArrayList ItemArray; 
    private string columnGroupTitle; 

    #endregion 

    #region constructors 

    public ScheduleGridColumnCollection(ArrayList items) 
    { 
     ItemArray = items; 
    } 

    #endregion 

    #region methods 

    /// <summary> 
    /// Finds the column corresponding to the data field. 
    /// </summary> 
    /// <param name="DataFieldName"></param> 
    /// <returns></returns> 
    public ScheduleGridColumn FindColumnDataField(string dataFieldName) 
    { 
     ScheduleGridColumn column = new ScheduleGridColumn(); 
     foreach (ScheduleGridColumn item in ItemArray.Cast<ScheduleGridColumn>()) 
     { 
      if (item.DataField == dataFieldName) 
      { 
       column = item; 
       break; 
      } 
     } 
     return column; 
    } 

    public bool ContainsColumnWithDataField(string dataFieldName) 
    { 
     foreach (ScheduleGridColumn item in ItemArray.Cast<ScheduleGridColumn>()) 
      if (item.DataField == dataFieldName) 
       return true; 
     return false; 
    } 

    /// <summary> 
    /// Adds an item to the collection. 
    /// </summary> 
    /// <param name="item"></param> 
    public void Add(ScheduleGridColumn item) 
    { 
     ItemArray.Add(item); 
    } 

    public void AddRange(ScheduleGridColumnCollection itemCollection) 
    { 
     foreach (ScheduleGridColumn item in itemCollection) 
      ItemArray.Add(item); 
    } 

    /// <summary> 
    /// Clears all items from the collection. 
    /// </summary> 
    public void Clear() 
    { 
     ItemArray.Clear(); 
    } 

    /// <summary> 
    /// Returns the enumerated equivalent of the collection. 
    /// </summary> 
    /// <returns></returns> 
    public IEnumerator GetEnumerator() 
    { 
     return ItemArray.GetEnumerator(); 
    } 

    /// <summary> 
    /// Copies the collection to the array parameter. 
    /// </summary> 
    /// <param name="array"></param> 
    /// <param name="index"></param> 
    public void CopyTo(Array array, int index) 
    { 
     ItemArray.CopyTo(array, index); 
    } 

    #endregion 

    #region properties 

    /// <summary> 
    /// Gets the schedule column located at the specified index. 
    /// </summary> 
    /// <param name="index"></param> 
    /// <returns></returns> 
    [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] 
    public ScheduleGridColumn this[int index] 
    { 
     get 
     { 
      return (ScheduleGridColumn)ItemArray[index]; 
     } 
    } 

    /// <summary> 
    /// Gets a schedule column from the collection based on a unique name. 
    /// </summary> 
    /// <param name="uniqueName"></param> 
    /// <returns></returns> 
    [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] 
    public ScheduleGridColumn this[string uniqueName] 
    { 
     get 
     { 
      ScheduleGridColumn dataColumn = null; 
      foreach (object item in ItemArray) 
       if (((ScheduleGridColumn)item).UniqueName == uniqueName) 
        dataColumn = (ScheduleGridColumn)item; 
      return dataColumn; 
     } 
    } 

    /// <summary> 
    /// Gets the total number of items in the collection. 
    /// </summary> 
    [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] 
    public int Count 
    { 
     get 
     { 
      return ItemArray.Count; 
     } 
    } 

    /// <summary> 
    /// Gets a value indicating whether the collection is read only. 
    /// </summary> 
    [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] 
    public bool IsReadOnly 
    { 
     get 
     { 
      return false; 
     } 
    } 

    /// <summary> 
    /// Gets a value indicating whether the collection is synchronized. 
    /// </summary> 
    [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] 
    public bool IsSynchronized 
    { 
     get 
     { 
      return false; 
     } 
    } 

    /// <summary> 
    /// Gets the sync root object. 
    /// </summary> 
    [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] 
    public object SyncRoot 
    { 
     get 
     { 
      return this; 
     } 
    } 

    /// <summary> 
    /// Gets or sets the column group title. 
    /// </summary> 
    [DesignerSerializationVisibility(DesignerSerializationVisibility.Visible)] 
    [Browsable(true)] 
    public string ColumnGroupTitle 
    { 
     get 
     { 
      return columnGroupTitle; 
     } 
     set 
     { 
      columnGroupTitle = value; 
     } 
    } 

    #endregion 
} 

#endregion 
+0

dal controllo utente Web si intende un file di .ascx? Questa è una classe personalizzata che estende System.Web.UI.WebControls.WebControl. Funzionerà per questo? – mrK

+0

Sì, dovrebbe funzionare per un controllo personalizzato che eredita dalla classe 'WebControl'. –

+0

C'è un motivo per cui stai usando un ItemCollection invece di un ControlCollection? – mrK