現在在學習服務器控件開發,感覺有的難度,比WinForm的難的多。
今天自己做了一個簡單的Repeater控件,當然不是很好,像vs2003自己的Repeater有好HeadTempLate 和ItemTempLate 和FootTempLate 三項模板,我自己做的只有一項,那就是 ItemTemp,也只能做簡單的數據綁定,廢話也不多說了,還是請各位網友看看源代碼吧,
using System;
using System.Web;
using System.Web.UI;
using System.Collections;
namespace WebControlLib.CH7
{
/// <summary>
/// 簡單的數據綁定控件
/// </summary>
[PersistChildren(true)]
public class SimpleRepeater:Control,INamingContainer
{
private ITemplate _template = null;
private ICollection _datasource = null;
public ICollection DataSource
{
get
{
return this._datasource;
}
set
{
this._datasource = value;
}
}
[TemplateContainer(typeof(RepeaterItem))]
public ITemplate ItemTempLate
{
get
{
return this._template;
}
set
{
this._template = value;
}
}
protected override void AddParsedSubObject(object obj)
{
base.AddParsedSubObject (obj);
}
protected override void CreateChildControls()
{
object obj = ViewState["NumData"];
this.Controls.Clear();
if(obj!=null)
{
int num = Convert.ToInt32(obj);
for(int i=0;i<num;i++)
{
RepeaterItem pi =new RepeaterItem(i,null);
_template.InstantiateIn(pi);
this.Controls.Add(pi);
}
}
}
protected override void OnDataBinding(EventArgs e)
{
base.OnDataBinding (e);
if(DataSource != null)
{
Controls.Clear();
ClearChildViewState();
IEnumerator data = DataSource.GetEnumerator();
int i =0;
while(data.MoveNext())
{
RepeaterItem item = new RepeaterItem(i,data.Current);
_template.InstantiateIn(item);
this.Controls.Add(item);
i++;
}
ChildControlsCreated = true;
ViewState["NumData"] =i;
}
}
}
public class RepeaterItem:Control,INamingContainer
{
private int _index;
private object _dataitem;
public RepeaterItem(int index, object dataitem)
{
this._index = index;
this._dataitem = dataitem;
}
public int Index
{
get
{
return this._index;
}
}
public object DataItem
{
get
{
return this._dataitem;
}
set
{
this._dataitem =value;
}
}
}
}
using System.Web;
using System.Web.UI;
using System.Collections;
namespace WebControlLib.CH7
{
/// <summary>
/// 簡單的數據綁定控件
/// </summary>
[PersistChildren(true)]
public class SimpleRepeater:Control,INamingContainer
{
private ITemplate _template = null;
private ICollection _datasource = null;
public ICollection DataSource
{
get
{
return this._datasource;
}
set
{
this._datasource = value;
}
}
[TemplateContainer(typeof(RepeaterItem))]
public ITemplate ItemTempLate
{
get
{
return this._template;
}
set
{
this._template = value;
}
}
protected override void AddParsedSubObject(object obj)
{
base.AddParsedSubObject (obj);
}
protected override void CreateChildControls()
{
object obj = ViewState["NumData"];
this.Controls.Clear();
if(obj!=null)
{
int num = Convert.ToInt32(obj);
for(int i=0;i<num;i++)
{
RepeaterItem pi =new RepeaterItem(i,null);
_template.InstantiateIn(pi);
this.Controls.Add(pi);
}
}
}
protected override void OnDataBinding(EventArgs e)
{
base.OnDataBinding (e);
if(DataSource != null)
{
Controls.Clear();
ClearChildViewState();
IEnumerator data = DataSource.GetEnumerator();
int i =0;
while(data.MoveNext())
{
RepeaterItem item = new RepeaterItem(i,data.Current);
_template.InstantiateIn(item);
this.Controls.Add(item);
i++;
}
ChildControlsCreated = true;
ViewState["NumData"] =i;
}
}
}
public class RepeaterItem:Control,INamingContainer
{
private int _index;
private object _dataitem;
public RepeaterItem(int index, object dataitem)
{
this._index = index;
this._dataitem = dataitem;
}
public int Index
{
get
{
return this._index;
}
}
public object DataItem
{
get
{
return this._dataitem;
}
set
{
this._dataitem =value;
}
}
}
}
下面是在網頁中課戶端調用的代碼:
<%@ Register TagPrefix="ableit" Namespace="WebControlLib.CH4" Assembly="WebControlLib" %>
<%@ Page language="c#" Codebehind="WebImageDemo.aspx.cs" AutoEventWireup="false" Inherits="WebControlDemo.CH4.WebImageDemo" %>
<%@ Register TagPrefix="cc1" Namespace="AbleControlsLib" Assembly="WebControlLib" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" >
<HTML>
<HEAD>
<title>WebImageDemo</title>
<meta name="GENERATOR" Content="Microsoft Visual Studio .NET 7.1">
<meta name="CODE_LANGUAGE" Content="C#">
<meta name="vs_defaultClientScript" content="JavaScript">
<meta name="vs_targetSchema" content="http://schemas.microsoft.com/intellisense/ie5">
</HEAD>
<body MS_POSITIONING="GridLayout">
<form id="Form1" method="post" runat="server">
<cc1:SimpleRepeater id="SimpleRepeater1" runat="server">
<ITEMTEMPLATE>
<TABLE borderColor="#ff3333" border="1">
<TR>
<TD><%# Container.DataItem%></TD>
</TR>
</TABLE>
</ITEMTEMPLATE>
</cc1:SimpleRepeater>
</form>
</body>
</HTML>
<%@ Page language="c#" Codebehind="WebImageDemo.aspx.cs" AutoEventWireup="false" Inherits="WebControlDemo.CH4.WebImageDemo" %>
<%@ Register TagPrefix="cc1" Namespace="AbleControlsLib" Assembly="WebControlLib" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" >
<HTML>
<HEAD>
<title>WebImageDemo</title>
<meta name="GENERATOR" Content="Microsoft Visual Studio .NET 7.1">
<meta name="CODE_LANGUAGE" Content="C#">
<meta name="vs_defaultClientScript" content="JavaScript">
<meta name="vs_targetSchema" content="http://schemas.microsoft.com/intellisense/ie5">
</HEAD>
<body MS_POSITIONING="GridLayout">
<form id="Form1" method="post" runat="server">
<cc1:SimpleRepeater id="SimpleRepeater1" runat="server">
<ITEMTEMPLATE>
<TABLE borderColor="#ff3333" border="1">
<TR>
<TD><%# Container.DataItem%></TD>
</TR>
</TABLE>
</ITEMTEMPLATE>
</cc1:SimpleRepeater>
</form>
</body>
</HTML>
下面是服務器代碼:
using System;
using System.Collections;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Web;
using System.Web.SessionState;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.HtmlControls;
namespace WebControlDemo.CH4
{
/// <summary>
/// WebImageDemo 的摘要說明。
/// </summary>
public class WebImageDemo : System.Web.UI.Page
{
protected AbleControlsLib.SimpleRepeater SimpleRepeater1;
private void Page_Load(object sender, System.EventArgs e)
{
// 在此處放置用戶代碼以初始化頁面
System.Collections.ArrayList array = new ArrayList();
array.Add("AAA");
array.Add("BBB");
array.Add("CCC");
array.Add("DDD");
array.Add("EEE");
array.Add("FFF");
array.Add("GGG");
array.Add("JJJ");
array.Add("HHH");
this.SimpleRepeater1.DataSource = array;
this.SimpleRepeater1.DataBind();
}
Web 窗體設計器生成的代碼
}
}
using System.Collections;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Web;
using System.Web.SessionState;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.HtmlControls;
namespace WebControlDemo.CH4
{
/// <summary>
/// WebImageDemo 的摘要說明。
/// </summary>
public class WebImageDemo : System.Web.UI.Page
{
protected AbleControlsLib.SimpleRepeater SimpleRepeater1;
private void Page_Load(object sender, System.EventArgs e)
{
// 在此處放置用戶代碼以初始化頁面
System.Collections.ArrayList array = new ArrayList();
array.Add("AAA");
array.Add("BBB");
array.Add("CCC");
array.Add("DDD");
array.Add("EEE");
array.Add("FFF");
array.Add("GGG");
array.Add("JJJ");
array.Add("HHH");
this.SimpleRepeater1.DataSource = array;
this.SimpleRepeater1.DataBind();
}
Web 窗體設計器生成的代碼
}
}
因爲我用的數據源是ICollection,所以綁定時,也只能是ICollection他派生的數據源;
如果大家有什麼意見,請多多指教和留言!!