如何构建一个以列表作为参数的用户控件,即:
<foo:TabMenu runat="server">
<Tabs>
<Tab Label="Tab1" PanelId="pnlTab1"/>
<Tab Label="Tab2" PanelId="pnlTab2"/>
<Tab Label="Tab3" PanelId="pnlTab3"/>
</Tabs>
</foo:TabMenu>
答案 0 :(得分:6)
你需要这样的东西。一切都很好,但你必须完成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; }
}
}
<强> TabCollection 强>
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.
}
<强> TabMenuControlCollection 强>
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);
}
}
答案 1 :(得分:1)
这是一个非常简单的解决方案。
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;
}
}