现在在学习服务器控件开发,感觉有的难度,比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 窗体设计器生成的代码#region Web 窗体设计器生成的代码
override protected void OnInit(EventArgs e)
...{
//
// CODEGEN: 该调用是 ASP.NET Web 窗体设计器所必需的。
//
InitializeComponent();
base.OnInit(e);
}
/**//// <summary>
/// 设计器支持所需的方法 - 不要使用代码编辑器修改
/// 此方法的内容。
/// </summary>
private void InitializeComponent()
...{
this.Load += new System.EventHandler(this.Page_Load);
}
#endregion
}
}
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 窗体设计器生成的代码#region Web 窗体设计器生成的代码
override protected void OnInit(EventArgs e)
...{
//
// CODEGEN: 该调用是 ASP.NET Web 窗体设计器所必需的。
//
InitializeComponent();
base.OnInit(e);
}
/**//// <summary>
/// 设计器支持所需的方法 - 不要使用代码编辑器修改
/// 此方法的内容。
/// </summary>
private void InitializeComponent()
...{
this.Load += new System.EventHandler(this.Page_Load);
}
#endregion
}
}
因为我用的数据源是ICollection,所以绑定时,也只能是ICollection他派生的数据源;
如果大家有什么意见,请多多指教和留言!!