现在在学习服务器控件开发,感觉有的难度,比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;
}
}
}
}
下面是在网页中课户端调用的代码:

<%...@ 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>
下面是服务器代码:
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
}
}
因为我用的数据源是ICollection,所以绑定时,也只能是ICollection他派生的数据源;
如果大家有什么意见,请多多指教和留言!!
本文分享了作者在学习服务器控件开发过程中实现的一个简单Repeater控件的源代码及使用示例,该控件支持数据绑定并展示了如何在ASP.NET Web应用程序中使用。
74

被折叠的 条评论
为什么被折叠?



