** 为 ** ** ASP.NET ** ** 组件加上 ** ** Collection ** ** 集合属性 ** ** (C#) **
大家可能都用过 Asp.net 中的 DropDownList 控件,该控件有一个 Items 的集合属性,用于设置组合框的下拉选项。这种体贴的做法让用户倍感温馨,现在,我们也发挥一下自己的的才智,创建一个相同功能的属性。
我们将要创建的控件叫 WebPanel ,该控件用于网站导航,并且可以收缩,外观如下:
第一个图是未收缩的效果,第二个是收缩后的效果,虽然不炫,但是足可以说明问题了。
接下来再看一幅图:
这里,就是 Collection 属性的编辑器,今天我们就围绕这种效果展开话题。
在上面的 Collection 属性的编辑器中,主要分成两个部分,左边的部分是对象的集合,右边部分是选定对象的属性,我们可以对每个属性进行设置赋值。
首先,我们定义一个类: StringItem,该类有两个自定义属性:Text用于显示的文本,HyperText是导航的超链接。
using System;
using System.Web.UI;
namespace NSWebPanel
{
///
1<summary>
2
3/// StringItem 的摘要说明。
4
5/// </summary>
///
public class StringItem : System.Web.UI.Control , IStateManager
{
private string _Text;
private string _HyperText;
public StringItem()
{
//
// TODO: 在此处添加构造函数逻辑
//
}
public string Text
{
set
{
_Text = value ;
}
get
{
return _Text;
}
}
public string HyperText
{
set
{
_HyperText = value ;
}
get
{
return _HyperText;
}
}
#region IStateManager 成员
void IStateManager.TrackViewState()
{
base .TrackViewState();
}
bool IStateManager.IsTrackingViewState
{
get
{
return base .IsTrackingViewState;
}
}
object IStateManager.SaveViewState()
{
return base .SaveViewState();
}
void IStateManager.LoadViewState( object state)
{
base .LoadViewState(state);
}
#endregion
}
}
然后,再创建一个用于存放多个 StringItem对象的类:StringItems, 需要注意的是:该类要继承CollectionBase,这样才能使用默认的Collection属性编辑器。
using System;
using System.Collections;
using System.Web.UI;
namespace NSWebPanel
{
///
1<summary>
2
3/// StringItems 的摘要说明。
4
5/// </summary>
public class StringItems : CollectionBase , IStateManager
{
private bool marked;
public StringItems() : base ()
{
//
// TODO: 在此处添加构造函数逻辑
//
}
private void Initialize()
{
marked = false ;
}
public StringItem this [ int index]
{
get
{
return (StringItem) base .List[index];
}
set
{
List[index] = value ;
}
}
public void Add(StringItem aItem)
{
base .List.Add(aItem);
}
public void Remove( int index)
{
if (index < base .Count - 1 && index > 0 )
{
base .List.RemoveAt(index);
}
}
#region IStateManager 成员
void IStateManager.TrackViewState()
{
for ( int i = 0 ; i < base .List.Count; i ++)
{
((IStateManager) base .List[i]).TrackViewState();
}
}
bool IStateManager.IsTrackingViewState
{
get
{
return marked;
}
}
object IStateManager.SaveViewState()
{
object [] iState = new object [ base .List.Count];
for ( int i = 0 ; i < base .List.Count; i ++)
{
iState[i] = ((IStateManager) base .List[i]).SaveViewState();
}
return iState;
}
void IStateManager.LoadViewState( object state)
{
if (state != null )
{
&