為ASP.NET組件加上Collection集合屬性(C#)
來源:互聯網
上載者:User
asp.net|集合 大家可能都用過Asp.net中的DropDownList控制項,該控制項有一個Items的集合屬性,用於設定組合框的下拉選項。這種體貼的做法讓使用者倍感溫馨,現在,我們也發揮一下自己的的才智,建立一個相同功能的屬性。
我們將要建立的控制項叫WebPanel,該控制項用於網站導航,並且可以收縮,外觀如下:
第一個圖是未收縮的效果,第二個是收縮後的效果,雖然不炫,但是足可以說明問題了。
接下來再看一幅圖:
這裡,就是Collection屬性的編輯器,今天我們就圍繞這種效果展開話題。
在上面的Collection屬性的編輯器中,主要分成兩個部分,左邊的部分是對象的集合,右邊部分是選取的物件的屬性,我們可以對每個屬性進行設定賦值。
首先,我們定義一個類:StringItem,該類有兩個自訂屬性:Text用於顯示的文本,HyperText是導航的超連結。
using System;
using System.Web.UI;
namespace NSWebPanel
{
/// <summary>
/// StringItem 的摘要說明。
/// </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
{
/// <summary>
/// StringItems 的摘要說明。
/// </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)
{
object[] viewState = (object[])state;
for(int i = 0 ; i < viewState.Length ; i ++)
{
((IStateManager)List[i]).LoadViewState(viewState[i]);
}
}
}
#endregion
}
}
最後,建立一個WEB控制項陳列庫,名稱為:NSWebPanel,以下是原始碼:
using System;
using System.Web.UI;
using System.Collections;
using System.Web.UI.WebControls;
using System.ComponentModel;
namespace NSWebPanel
{
/// <summary>
/// WebCustomControl1 的摘要說明。
/// </summary>
public class WebCustomControl1 : System.Web.UI.WebControls.WebControl,INamingContainer,IStateManager
{
private const string SCRIPT = "<table id='t' border='1' width='228' height='145' bordercolor='#000000' cellspacing='0' cellpadding='0' bordercolorlight='#000000' bordercolordark='#FFFFFF'>\n" +
"<tr>\n" +
"<td width='228' height='20'>\n" +
"<table border='0' width='100%' cellpadding='0' cellspacing='0'>\n" +
"<tr>\n" +
"<td width='10%' bgcolor='#CCCCFF' id='sign' ;\n" +
"}\n" +
"flag = !flag;\n" +
"}\n" +
"</script>\n";
private StringItems _Strings;
//注意下面紅色的部分,一定要寫哦
[
PersistenceMode(PersistenceMode.InnerProperty),
DesignerSerializationVisibility(DesignerSerializationVisibility.Content)
]
public StringItems Strings
{
get
{
if(_Strings == null)
_Strings = new StringItems();
return _Strings;
}
}
private string _Caption;
public string Caption
{
get
{
return _Caption;
}
set
{
_Caption = value;
}
}
#region 事件
private static object _FieldEvent = null;
public event System.EventHandler ProcessEvent
{
add
{
Events.AddHandler(_FieldEvent,value);
}
remove
{
Events.RemoveHandler(_FieldEvent,value);
}
}
#endregion
public void Execute()
{
EventHandler hander = (EventHandler)Events[_FieldEvent];
if(hander != null)
{
hander(this,null);
}
}
public override void RenderBeginTag(HtmlTextWriter writer)
{
base.RenderBeginTag (writer);
System.Text.StringBuilder str = new System.Text.StringBuilder();
str.AppendFormat(SCRIPT,this.Caption,_Strings[0].Text,_Strings[1].Text,_Strings[2].Text,_Strings[3].Text,_Strings[4].Text,_Strings[0].HyperText,_Strings[1].HyperText,_Strings[2].HyperText,_Strings[3].HyperText,_Strings[4].HyperText);
writer.WriteLine(str.ToString());
}
protected override void OnPreRender(EventArgs e)
{
base.OnPreRender (e);
if(!Page.IsClientScriptBlockRegistered("13C165F4-DB2E-4484-AB1B-5B1F32C8FC8B"))
{
Page.RegisterClientScriptBlock("13C165F4-DB2E-4484-AB1B-5B1F32C8FC8B",JAVASCRIPT);
}
}
public override string ClientID
{
get
{
return base.ClientID + "LZH";
}
}
protected override void AddAttributesToRender(HtmlTextWriter writer)
{
base.AddAttributesToRender (writer);
writer.AddStyleAttribute("font-size","14px");
}
protected override HtmlTextWriterTag TagKey
{
get
{
return HtmlTextWriterTag.Div;
}
}
#region IStateManager 成員
void IStateManager.TrackViewState()
{
base.TrackViewState();
}
bool IStateManager.IsTrackingViewState
{
get
{
// TODO: 添加 WebCustomControl1.IsTrackingViewState getter 實現
return false;
}
}
object IStateManager.SaveViewState()
{
// TODO: 添加 WebCustomControl1.SaveViewState 實現
return null;
}
void IStateManager.LoadViewState(object state)
{
// TODO: 添加 WebCustomControl1.LoadViewState 實現
}
#endregion
}
}