代码之家  ›  专栏  ›  技术社区  ›  Niels Bosma

ASP.NET:生成以列表为参数的用户控件?

  •  3
  • Niels Bosma  · 技术社区  · 15 年前

    如何构建以列表为参数的用户控件,即:

    <foo:TabMenu runat="server">
    <Tabs>
    <Tab Label="Tab1" PanelId="pnlTab1"/>
    <Tab Label="Tab2" PanelId="pnlTab2"/>
    <Tab Label="Tab3" PanelId="pnlTab3"/>
    </Tabs>
    </foo:TabMenu>
    
    2 回复  |  直到 14 年前
        1
  •  6
  •   m3kh    15 年前

    你需要这样的东西。一切正常,但您必须完成tabcollection类。

    编辑: 对不起,我没有测试代码。不管怎样,发现了一些问题就解决了。

    用户控制

    [ParseChildren(true, "Tabs"), PersistChildren(false)]
    public partial class TabMenu : UserControl
    {
    
        private TabCollection _tabs;
    
        [Browsable(false), PersistenceMode(PersistenceMode.InnerProperty), MergableProperty(false)]
        public virtual TabCollection Tabs
        {
            get
            {
                if (this._tabs == null)
                    this._tabs = new TabCollection(this);
                return this._tabs;
            }
        }
    
        protected override ControlCollection CreateControlCollection()
        {
            return new TabMenuControlCollection(this);
        }
    
    }
    

    标签

    public class Tab : HtmlGenericControl
    {
    
        public string Label
        {
            get { return (string)ViewState["Label"] ?? string.Empty; }
            set { ViewState["Label"] = value; }
        }
    
    }
    

    制表符集合

    public class TabCollection : IList, ICollection, IEnumerable
    {
    
        private TabMenu _tabMenu;
    
        public TabCollection(TabMenu tabMenu)
        {
            if (tabMenu == null)
                throw new ArgumentNullException("tabMenu");
    
            this._tabMenu = tabMenu;
        }
    
        public virtual int Add(Tab tab)
        {
            if (tab == null)
                throw new ArgumentNullException("tab");
    
            this._tabMenu.Controls.Add(tab);
    
            return this._tabMenu.Controls.Count - 1;
        }
    
        int IList.Add(object value)
        {
            return this.Add((Tab)value);
        }
    
        // You have to write other methods and properties as Add.
    
    }
    

    选项卡控件集合

    public class TabMenuControlCollection : ControlCollection
    {
    
        public TabMenuControlCollection(TabMenu owner) : base(owner) { }
    
        public override void Add(Control child)
        {
            if (child == null)
                throw new ArgumentNullException("child");
    
            if (!(child is TabMenu))
                throw new ArgumentException("The TabMenu control can only have a child of type 'Tab'.");
    
            base.Add(child);
        }
    
        public override void AddAt(int index, Control child)
        {
            if (child == null)
                throw new ArgumentNullException("child");
    
            if (!(child is TabMenu))
                throw new ArgumentException("The TabMenu control can only have a child of type 'Tab'.");
    
            base.AddAt(index, child);
        }
    
    }
    
        2
  •  1
  •   Carter Medlin    14 年前

    这里有一个非常简单的解决方案。

    Partial Class UserControlStrings_TabMenu
        Inherits System.Web.UI.UserControl
    
        Private _Tabs As New MyTabsClass(Me)
    
        <PersistenceMode(PersistenceMode.InnerProperty)>
        Public ReadOnly Property Tabs As MyTabsClass
            Get
                Return _Tabs
            End Get
        End Property
    End Class
    
    Public Class MyTabsClass
        Inherits ControlCollection
    
        Sub New(ByVal owner As Control)
            MyBase.New(owner)
        End Sub
    
        Public Overrides Sub Add(ByVal child As System.Web.UI.Control)
            MyBase.Add(New MyTab(child))
        End Sub
    End Class
    
    
    Public Class MyTab
        Inherits HtmlGenericControl
    
        Sub New(ByVal GenericControl As HtmlGenericControl)
            MyBase.New()
            Me.Label = GenericControl.Attributes("Label")
            Me.PanelId = GenericControl.Attributes("Panelid")
        End Sub
    
        Public Property Label As String = String.Empty
        Public Property PanelId As String = String.Empty
    
        Public Overrides Function ToString() As String
            Return Me.Label & "-" & Me.PanelId
        End Function
    End Class
    

    (C版本)

    using System;
    using System.Collections;
    using System.Collections.Generic;
    using System.Data;
    using System.Diagnostics;
    partial class UserControlStrings_MyControl : System.Web.UI.UserControl
    {
    
    
        private MyTabsClass _Tabs = new MyTabsClass(this);
    
        [System.Web.UI.PersistenceMode(System.Web.UI.PersistenceMode.InnerProperty)]
        public MyTabsClass Tabs {
            get { return _Tabs; }
        }
    }
    
    public class MyTabsClass : System.Web.UI.ControlCollection
    {
    
        public MyTabsClass(System.Web.UI.Control owner) : base(owner)
        {
        }
    
        public override void Add(System.Web.UI.Control child)
        {
            base.Add(new MyTab(child));
        }
    }
    
    
    public class MyTab : System.Web.UI.HtmlControls.HtmlGenericControl
    {
    
        public MyTab(System.Web.UI.HtmlControls.HtmlGenericControl GenericControl) : base()
        {
            this.Label = GenericControl.Attributes("Label");
            this.PanelId = GenericControl.Attributes("Panelid");
        }
    
    
        private string _Label = System.String.Empty;
        public string Label {
            get { return _Label; }
            set { _Label = value; }
        }
    
        private string _PanelId = System.String.Empty;
        public string PanelId {
            get { return _PanelId; }
            set { _PanelId = value; }
        }
    
        public override string ToString()
        {
            return this.Label + "-" + this.PanelId;
        }
    }