2011-10-19 29 views
5

Tôi đang cố gắng để phát triển một điều khiển tùy chỉnh cho asp.net rằng sẽ có đánh dấu sau:Làm thế nào để làm cho một điều khiển với một bộ sưu tập kiểm soát trẻ em trong ASP.Net

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

Những loại tài sản sẽ cho phép tôi làm điều này khi tôi đang phát triển sự kiểm soát của mình? (Các bộ sưu tập các mặt hàng là một phần trong câu hỏi).

Trả lời

6

Bạn không thể có các phần tử lồng nhau trong Điều khiển người dùng web chuẩn. Bạn sẽ cần phải phát triển một điều khiển máy chủ tùy chỉnh để đạt được điều đó. Để cho phép các phần tử lồng nhau trong điều khiển máy chủ tùy chỉnh, bạn cần sử dụng thuộc tính PersistenceMode và đặt thành 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; 
    } 
} 

Dưới đây là một ví dụ từ một điều khiển mà tôi tạo ra:

kiểm soát 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 lớp

#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 class

#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

Bằng cách điều khiển người dùng Web, bạn có nghĩa là tệp .ascx? Đây là một lớp tùy chỉnh mở rộng System.Web.UI.WebControls.WebControl. Nó sẽ làm việc cho điều này? – mrK

+0

Có, nó sẽ làm việc cho một điều khiển tùy chỉnh kế thừa từ lớp 'WebControl'. –

+0

Có lý do nào bạn đang sử dụng một ItemCollection thay vì một ControlCollection không? – mrK

Các vấn đề liên quan