Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/256.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在ASP.Net中创建具有子控件集合的控件_C#_Asp.net_Collections_Controls_Custom Controls - Fatal编程技术网

C# 如何在ASP.Net中创建具有子控件集合的控件

C# 如何在ASP.Net中创建具有子控件集合的控件,c#,asp.net,collections,controls,custom-controls,C#,Asp.net,Collections,Controls,Custom Controls,我正在尝试为asp.net开发一个自定义控件,该控件将具有以下标记: <bk:ControlMenu ID="cmTest" runat="server" Width="400px"> <Items> <asp:Textbox> <asp:Checkbox> [ List of controls... ] </Items> </bk:Co

我正在尝试为asp.net开发一个自定义控件,该控件将具有以下标记:

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

[控制清单…]

什么样的属性允许我在开发控件时执行此操作?(项目集合是有问题的部分)。

标准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;
    }
}
//
///获取列集合。
/// 
[可浏览(正确)]
[DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
[PersistenceMode(PersistenceMode.InnerProperty)]
公共物品收集项目
{
得到
{
if(itemCollection==null)
{
if(itemArrayList==null)
{
this.ensureChildControl();
if(itemArrayList==null)
itemArrayList=新的ArrayList();
}
itemCollection=新的itemCollection(itemArrayList);
}
回收物品;
}
}
下面是我创建的控件的一个示例:

调度网格控制

/// <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;
    }
}
//
///获取列集合。
/// 
[可浏览(正确)]
[DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
[PersistenceMode(PersistenceMode.InnerProperty)]
公共ScheduleGridColumnCollection列
{
得到
{
if(scheduleColumnsCollection==null)
{
if(scheduleColumnsArrayList==null)
{
this.ensureChildControl();
if(scheduleColumnsArrayList==null)
scheduleColumnsArrayList=新建ArrayList();
}
scheduleColumnsCollection=新ScheduleGridColumnSCollection(scheduleColumnsArrayList);
}
返回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
#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
#地区明细栏
[儿童(对)]
公共密封类ScheduleGridColumn:DataGridColumn,INamingContainer
{
#区域私有成员变量
启用私有布尔编辑模式;
私有布尔集合列;
私有字符串唯一名称;
私有字符串dataFieldName;
私有字符串聚合键;
私有字符串dataFormatString;
私有ITemplate editTemplate=null;
#端区
#区域构造函数
/// 
///使用默认值初始化GridColumn对象。
/// 
公共ScheduleGridColumn()
{
//将其他字段初始化为默认值
dataFieldName=String.Empty;
dataFormatString=String.Empty;
uniqueName=String.Empty;
//默认情况下禁用编辑模式
editModeEnabled=false;
}
#端区
#区域属性
/// 
///获取或设置编辑模板。
///       
[DesignerSerializationVisibility(DesignerSerializationVisibility.Visible),
PersistenceMode(PersistenceMode.InnerProperty),
TemplateInstance(TemplateInstance.Single)]
公共ITemplate编辑模板
{
得到
{
返回编辑模板;
}
设置
{
编辑模板=值;
}
}
/// 
///获取或设置唯一名称。
/// 
[可浏览(正确)]
[DesignerSerializationVisibility(DesignerSerializationVisibility.Visible)]
公共字符串唯一名称
{
得到
{
返回唯一名称;
}
设置
{
uniqueName=值;
}
}
/// 
///获取或设置数据字段的名称。
/// 
[可浏览(正确)]
[DesignerSerializationVisibility(DesignerSerializationVisibility.Visible)]
公共字符串数据字段
{
得到
{
返回dataFieldName;
}
设置
{
dataFieldName=值;
}
}
/// 
///获取或设置用于格式化数据的格式字符串。
/// 
[可浏览(正确)]
[DesignerSerializationVisibility(DesignerSerializationVisibility.Visible)]
公共字符串DataFormatString
{
得到
{
返回dataFormatString;
}
设置
{
dataFormatString=值;
}
}
/// 
///获取或设置一个值,该值指示项
///处于编辑模式。
/// 
[可浏览(正确)]
[DesignerSerializationVisibility(DesignerSerializationVisibility.Visible)]
公共布尔编辑模式已启用
{
得到
{
返回编辑模式启用;
}
设置
{
editModeEnabled=值;
}
}
/// 
///获取或设置一个值,该值指示是否应聚合该项。
/// 
[可浏览(正确)]
[DesignerSerializationVisibility(DesignerSerializationVisibility.Visible)]
公共图书馆
{
得到
{
返回集合列;
}
设置
{
aggregateColumn=值;
}
}
/// 
///获取或设置聚合键。
/// 
[可浏览(正确)]
[DesignerSerializationVisibility(DesignerSerializationVisibility.Visible)]
公共字符串聚合键
{
得到
{
返回聚合键;
}
设置
{
聚合键=值;
}
}
#端区
}
#端区
ScheduleGridColumnCollection类

#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
#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
#区域明细表列集合
[儿童(对)]
公共密封类ScheduleGridColumnCollection:ICollection
{
#区域成员变量
私有数组列表项数组;
私有字符串columnGroupTitle;
#端区
#区域构造函数
公共ScheduleGridColumnCollection(ArrayList项)
{
项目数组