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

2024-03-14

我正在尝试为 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;
    }
}

这是我创建的控件的示例:

时间表网格控件

/// <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
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 ASP.Net 中创建带有子控件集合的控件 的相关文章

  • 在Application_AquireRequestState事件中用POST数据重写Url

    我有一个在其中注册路线的代码Application AcquireRequestState应用程序的事件 注册路由后 我会在 Http 运行时缓存中设置一个标志 这样我就不会再次执行路由注册代码 在此事件中注册路线有特定原因Applicat
  • 访问“if”语句之外的变量

    我怎样才能使insuranceCost以外可用if陈述 if this comboBox5 Text Third Party Fire and Theft double insuranceCost 1 在 if 语句之外定义它 double
  • 如何在网格视图的单元格中插入换行符?

    我想知道如何在网格视图的单元格中添加换行符 现在 我把 1 1 1 然而 这呈现为 1 1 1 如何修复换行符 以便每个数字显示在自己的行上 Add HtmlEncode False to asp BoundField并且在正文中 应该有
  • 找到的程序集的清单定义与程序集引用不匹配

    我试图在 C Windows 窗体应用程序 Visual Studio 2005 中运行一些单元测试 但出现以下错误 System IO FileLoadException 无法加载文件或程序集 实用程序 版本 1 2 0 200 文化 中
  • 从 future 中检索值时的 SIGABRT

    我在使用 C 11 future 时遇到问题 当我打电话时wait or get 关于返回的未来std async 程序接收从mutex标头 可能是什么问题呢 如何修复它 我在 Linux 上使用 g 4 6 将以下代码粘贴到 ideone
  • 导出类时编译器错误

    我正在使用 Visual Studio 2013 但遇到了一个奇怪的问题 当我导出一个类时 它会抛出 尝试引用已删除的函数 错误 但是 当该类未导出时 它的行为会正确 让我举个例子 class Foo note the export cla
  • 如何在 Asp.net Gridview 列中添加复选框单击事件

    我在 asp 中有一个 gridview 其中我添加了第一列作为复选框列 现在我想选择此列并获取该行的 id 值 但我不知道该怎么做 这是我的 Aspx 代码
  • 防止GDB中的PLT(过程链接表)断点

    在最新版本的 GDB 中 在库函数调用上设置断点会导致多个实际断点 调用过程链接表 PLT 实际的函数调用 这意味着当调用库函数时 我们每次都会经历两次中断 在以前的 GDB 版本中 只会创建 2 因此您只能得到一次中断 那么问题来了 是否
  • 格式化货币

    在下面的示例中 逗号是小数点分隔符 我有这个 125456 89 我想要这个 125 456 89 其他示例 23456789 89 gt 23 456 789 89 Thanks 看看这个例子 double value 12345 678
  • 特征密集稀疏矩阵乘积是线程化的吗?

    我知道稀疏密集产品是根据文档进行线程化的 https eigen tuxfamily org dox TopicMultiThreading html https eigen tuxfamily org dox TopicMultiThre
  • dropdownlist DataTextField 由属性组成?

    有没有一种方法可以通过 C 使 asp net 中的下拉列表的 datatextfield 属性由对象的多个属性组成 public class MyObject public int Id get set public string Nam
  • 允许使用什么类型的内容作为 C 预处理器宏的参数?

    老实说 我很了解 C 编程语言的语法 但对 C 预处理器的语法几乎一无所知 尽管我有时在编程实践中使用它 所以问题来了 假设我们有一个简单的宏 它扩展为空 define macro param 可以放入宏调用构造中的语法有哪些限制 调用宏时
  • 正确使用“extern”关键字

    有一些来源 书籍 在线材料 解释了extern如下 extern int i declaration has extern int i 1 definition specified by the absence of extern 并且有支
  • 奇怪的 ASP.NET 错误!

    我正在运行带有 IIS 7 5 的 Windows 7 x64 版本 我有一个简单的 asp net 网站 我在其他版本的 Windows 和 IIS 上运行该网站 但现在在某些页面上出现以下错误 异常信息 异常类型 HttpParseEx
  • TPL 数据流块下游如何获取源生成的数据?

    我正在使用 TPL Dataflow 处理图像 我收到处理请求 从流中读取图像 应用多次转换 然后将生成的图像写入另一个流 Request gt Stream gt Image gt Image gt Stream 为此 我使用块 Buff
  • #pragma pack(16) 和 #pragma pack(8) 的效果总是相同吗?

    我正在尝试使用来对齐数据成员 pragma pack n http msdn microsoft com en us library 2e70t5y1 28v vs 100 29 aspx 以下面为例 include
  • 为什么使用 HTTP 动词?

    因为动词的目标是像 server domain getallrecords 或 server domain delete1record 或类似的 URL 而getallrecords delete1record都是专门为特定目的而设计的 为
  • 启动画面后主窗口出现在其他窗口后面

    我有一个带有启动屏幕的 Windows 窗体应用程序 当我运行该应用程序时 启动屏幕显示正常 消失并加载应用程序的主窗体 但是 当我加载主窗体时 它出现在包含该应用程序的 Windows 资源管理器目录下 这是运行启动画面然后运行主窗体的代
  • 无法使 Polly 超时策略覆盖 HttpClient 默认超时

    我正在使用 Polly 重试策略 并且正如预期的那样 在重试过程中HttpClient达到 100 秒超时 我尝试了几种不同的方法来合并 Polly 超时策略 将超时移至每次重试而不是总计 但 100 秒超时仍然会触发 我读过大约 5 个
  • FindAsync 很慢,但是延迟加载很快

    在我的代码中 我曾经使用加载相关实体await FindAsync 希望我能更好地遵守 C 异步指南 var activeTemplate await exec DbContext FormTemplates FindAsync exec

随机推荐