2011-10-19 23 views
5

我想開發asp.net的自定義控件,將有以下標記控制:我如何與ASP.Net子控件集合

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

什麼樣的屬性將讓我在開發我的控制時做到這一點? (項目集合是有問題的部分)。

回答

6

您不能在標準Web用戶控件中嵌套元素。你需要開發一個自定義服務器控件來實現這一點。要允許在自定義服務器控件中嵌套元素,您需要使用PersistenceMode屬性並將其設置爲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; 
    } 
} 

下面是我創建了一個控制一個例子:

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; 
    } 
} 

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類

#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

通過Web用戶控件你說的是.ascx文件?這是一個擴展System.Web.UI.WebControls.WebControl的自定義類。它會爲此工作嗎? – mrK

+0

是的,它應該適用於繼承自「WebControl」類的自定義控件。 –

+0

是否有你使用ItemCollection而不是ControlCollection的原因? – mrK