repeater控件主要用于显示数据,因为具有良好的扩展性和自由性,被大量使用显示数据。
1、自定义控件的创建和使用
本次主要讲诉继承现有的控件,非完全自定义的控件。该种控件的创建和使用分为3个步骤,第一步:自定义类,继承现有的控件;第二步:在网页上注册;第三步:使用。
(1)、自定义类
namespace WebAppThreeLayers.UI
{
public class CustomGrid : Repeater
{
.......
}
}
(2)、在网页上注册
<%@ Register TagPrefix="jwtControl" Namespace="WebAppThreeLayers.UI" Assembly="WebAppThreeLayers" %>
TagPrefix:前缀。如:<asp:Button ID="btn" Text="Sure" />中的asp
Namespace:命名空间,指该自定义类所在的命名空间。如:WebAppThreeLayers.UI
Assembly:动态链接库的名称。如:System.Web.Extensions。注意:不能带“.dll”后缀。
注意,也可以把注册功能放到web.config中。
<system.web>
<pages>
<controls>
<add tagPrefix="jwtControl" namespace="WebAppThreeLayers.UI" assembly="WebAppThreeLayers"/>
</controls>
</pages>
</system.web>
(3)、使用
<jwtControl:CustomGrid ID="itemsGrid" runat="server"></jwtControl:CustomGrid>
在后台代码中,可以直接使用itemsGrid(ID)指代该自定义控件。
2、自定义控件的绘制(渲染)
本节内容主要是讲诉自定义控件的输出内容。在自定义控件中重载Render方法即可实现。
以下自定义控件主要显示功能为:在没有数据时,显示“当前没有数目,Sorry”,当有数据时,采用模板中定义的格式显示。
<jwtControl:CustomGrid ID="itemsGrid" runat="server" EmptyText="当前没有数目,Sorry">
<HeaderTemplate>
<table cellspacing="0" cellpadding="0" border="0" width="387">
<tr>
<td>
ID
</td>
<td>
Name
</td>
<td>
Desc
</td>
<td>
Price
</td>
</tr>
</HeaderTemplate>
<ItemTemplate>
<tr>
<td>
<%# Eval("ID") %>
</td>
<td>
<%# Eval("Name") %>
</td>
<td>
<%# Eval("DESC")%>
</td>
<td>
<%# Eval("PRICE")%>
</td>
</tr>
</ItemTemplate>
<FooterTemplate>
</table>
</FooterTemplate>
</jwtControl:CustomGrid>
namespace WebAppThreeLayers.UI
{
public class CustomGrid : Repeater
{
/// <summary>
/// 数据源数据量个数
/// </summary>
private int _itemCount;
virtual protected int ItemCount
{
get { return _itemCount; }
set { _itemCount = value; }
}
/// <summary>
/// 无数据时显示
/// </summary>
private string _emptyText;
public string EmptyText
{
set { _emptyText = value; }
get { return _emptyText; }
}
/// <summary>
/// Setting DataSource
/// </summary>
override public object DataSource
{
set
{
try
{
base.DataSource = value;
ItemCount = ((DataTable)value).Rows.Count;
}
catch
{
base.DataSource = null;
ItemCount = 0;
}
}
}
/// <summary>
/// Overriden method to control how the page is rendered
/// </summary>
/// <param name="writer"></param>
protected override void Render(HtmlTextWriter writer)
{
//Check there is some data attached
if (ItemCount == 0)
{
writer.Write(_emptyText);
return;
}
base.Render(writer);
}
}
}
在Render中,需要向HtmlTextWriter中添加html格式的输出内容,而base.Render()则是按照数据模板由reapter完成数据内容输出。