ASP.NET中数据访问控件比较
--不尽知用兵之害者,则不能尽知用兵之利也
2005年12月22日
ASP.NET提供了组件的编程模型,我们可以像使用vb和delph一样通过简单拖拽就能生成想要的页面,这些都依赖于asp.net的服务器控件。asp.net内置的很多功能十分强大的数据控件,这些控件有哪些优缺点,我们该怎样选择使用哪个框架。我们从以下几个方面进行比较分析,然后简单总结选择数据控件的原则。
一.介绍
Repeater 简单的只读输出
功能:
没有对选择或编辑项的内置支持。
没有默认外观;必须通过创建模板布局列表。列表可为垂直、水平、所有数据均在一行或您指定的任何格式。
没有默认分页,所有数据都在单个列表中显示。
可以使用模板定义元素之间的分隔符。
支持可应用于各个项的自定义功能(例如,为每项指定一个“添加到购物车”按钮)。
DataList 列表输出,具有编辑功能 ,非表格式的列表(例如,逗号间隔的列表) ,可轻松自定义的输出
功能:
默认显示为表的外观,但可配置用于显示任意列表输出。
可广泛地自定义列表的外观。
具有一个自动格式化选项。
所见即所得模板编辑。
支持项的自定义外观的样式。
可以使用模板定义元素之间的分隔符。
具有可编辑的内容(内容在文本框或其他控件中显示,具体取决于绑定数据的数据类型)。
支持单项选择。多重选择需要自定义代码。
支持数据项的水平(列)或垂直(行)布局。
没有默认分页,所有数据都在单个列表中显示。
支持可应用于各个项的自定义功能(例如,为每项指定一个“添加到购物车”按钮)。
DataGrid 具有编辑功能的功能完善的列表输出 ,分页报告 , 默认情况下具有网格外观。
功能:
可广泛地自定义网格的外观。
具有一个自动格式化选项。
可使用绑定列、按钮或超级链接的列、以及用模板创建的自定义列指定输出。
没有分隔符模板。但是,网格呈现在表中,可以指定表边框大小和颜色。
支持所见即所得模板编辑。
项支持自定义外观的样式。
可编辑、更新和删除内容。
支持单项选择。多重选择需要自定义代码。
具有可选的分页输出。
支持排序。
支持可应用于各个项的自定义功能(例如,为每项指定一个“添加到购物车”按钮)。
GridView 用于替代DataGrid,因此具有DataGrid的一切功能,并且进行了增强和改进。
功能:
增强了设计时支持。
增强了数据源绑定能力。
增加了列类型。
内置和可定制的分页。
改善了事件模型。
二.比较
1.编程难易性(可用性)。
GridView(2.0):
GridView功能最强大,在合适的情况下使用会极大地提高开发效率,减少开发代码量。增加了数据源控件引用,对分页,排序的支持更完善。用于替代DataGrid。
DataGrid(1.1):
DataGrid是1.1中功能最强大,在合适的情况下使用会极大地提高开发效率,减少开发代码量。
DataList(1.1):
使用 EditItemIndex 模板以及 EditCommand、UpdateCommand 和 CancelCommand 事件,DataList 可以支持内联编辑。 但是,用 DataList 添加这样的功能比用 DataGrid 花费的开发时间要长。DataList 的数据排序、分页和编辑比较困难。
Repeater(1.1):
使用 Repeater 时要用模板指定标记。Repeater 还缺少有助于支持分页、编辑或数据编辑的内置功能。Repeater 缺少 DataGrid 和 DataList 二者共有的样式属性。
2.灵活性。
GridView(2.0)和DataGrid(1.1):
GridView和DataGrid提供了复杂的功能,它们将很多控件的功能集和在一起,留给开发人员的定制接口少(而且即使有也难于使用),灵活性最差。
DataList(1.1):
DataList允许我们自定义显示模版,使用 DataList 能够产生更为友好的数据显示。
Repeater(1.1):
DataGrid 或 DataList 会在预设的 HTML 标记中自动包含开发人员指定的内容。Repeater 在呈现的时候将严格生成指定的 HTML 标记。 如果不想用 HTML
标记显示数据,而希望以其他方式显示数据,就必须使用 Repeater 控件。
3.性能。
GridView(2.0)和DataGrid(1.1):
GridView和DataGrid性能较差。由于这两个控件功能强大,所以控件本身很复杂,控件的类比较大,占用很大的内存。服务器进程处理该类的时间也较长,另外控件会产生很多额外的数据会加重服务器的负荷,尤其在使用viewState时,开销会更大。
DataList(1.1):
DataList 的性能比 DataGrid 的性能好。
Repeater(1.1):
Repeater 的性能比 DataList 的性能稍微好一点,比 DataGrid 的性能要好很多。
三.使用原则
没有十全十美的事,只能在各方力量之间寻找一种相对的平衡。
我们上面简单介绍并比较了GridView(2.0),DataGrid(1.1),DataList(1.1)和Repeater(1.1)四个数据访问控件,它们有其适用的场合,也有其不适用的场合。
MS的建议是:
要包括自动分页和排序功能,请使用 DataGrid Web 服务器控件。
使用 DataList 控件以非表格式布局显示数据。
若要精确地控制用于呈现列表的 HTML,请使用 Repeater Web 服务器控件。
其实对于实际项目我们必须从上面考虑的三个方面甚至更多去综合权衡该使用什么控件。不能讳疾忌医,害怕高级控件的灵活性不够和内存开销大,而不使用类似GridView的控件;当然也不能没病找病,为了追求开发效率而一味使用这些高级控件。应该在开发效率,维护成本,运行效率,扩展性和灵活性中寻找一个平衡。
使用嵌套的Repeater控件显示分级数据 发布人:gxy 点击数:10 2008-5-3 16:39:35
|
简介
本文描述如何使用嵌套的Repeater 控件来显示分级数据 。当然了,你也可以将这一技术应用到其他的列表绑定控件上去,比如DataGrid包含DataGrid,DataList包含DataList等等的组合。 绑定到父表 1.添加一个新的Web Form 到应用程序项目中,名称为Nestedrepeater.aspx. 2.从工具箱托动一个Repeater 控件到这个页面上, 设定其ID 属性为 parent . 3.切换到HTML 视图. 4.选中下列<itemtemplate> 代码,复制到Repeater 控件对应的位置。注意,粘贴的时候请使用“粘贴为html”功能。这些语句包含了数据绑定语法,很简单。
<itemtemplate> <b><%# DataBinder.Eval(Container.DataItem, "au_id") %></b><br> </itemtemplate> |
5.打开Nestedrepeater.aspx.cs 这个代码分离文件。降下列代码添加到Page_Load 事件中,其作用是建立一个到 Pubs (这个数据库是sql server的演示数据库。另外在安装.net framework sdk的时候也会安装这个数据库)数据库的连接,并绑定Authors 表到Repeater 控件
public void Page_Load() { SqlConnection cnn = new SqlConnection("server=(local);database=pubs;uid=sa;pwd=;"); SqlDataAdapter cmd1 = new SqlDataAdapter("select * from authors",cnn); DataSet ds = new DataSet(); cmd1.Fill(ds,"authors"); //这里将要插入子表的数据绑定 parent.DataSource = ds.Tables["authors"]; Page.DataBind(); cnn.Close(); } |
6.在文件的头部添加下面的名称空间 using System.Data.SqlClient; 7.根据你自己的情况修改一下连接字符串 8.保存并编译应用程序 9.在浏览器中打开这个页面,输出结果类似于下面的格式
172-32-1176 213-46-8915 238-95-7766 267-41-2394 ... |
绑定到子表 1.在页面的HTML视图中,添加下列代码。其目的是增加子Repeater 控件到父Repeater的项目模板中,形成嵌套。
<asp:repeater id="child" runat="server"> <itemtemplate> <%# DataBinder.Eval(Container.DataItem, "[/"title_id/"]") %><br> </itemtemplate> </asp:repeater> |
2.设置子Repeater 控件的DataSource 属性:
<asp:repeater ... datasource='<%# ((DataRowView)Container.DataItem) .Row.GetChildRows("myrelation") %>'> |
3.在页面顶部添加下列指令(请注意,是在.aspx文件中): <%@ Import Namespace="System.Data" %> 在.cs文件中,将Page_Load中的注释部分(//这里将要插入子表的数据绑定)替换成下列代码:
SqlDataAdapter cmd2 = new SqlDataAdapter("select * from titleauthor",cnn); cmd2.Fill(ds,"titles"); ds.Relations.Add("myrelation", ds.Tables["authors"].Columns["au_id"], ds.Tables["titles"].Columns["au_id"]); |
4.保存并编译应用程序。 .在浏览器中察看修改后的页面。显示格式类似于下面的格式:
172-32-1176 PS3333 213-46-8915 BU1032 BU2075 238-95-7766 PC1035 267-41-2394 BU1111 TC7777 ... |
完整的代码
Nestedrepeater.aspx <%@ Page Language=C# Inherits="yourprojectname.nestedrepeater" %> <%@ Import Namespace="System.Data" %> <html> <body> <form runat=server> <!-- start parent repeater --> <asp:repeater id="parent" runat="server"> <itemtemplate> <b><%# DataBinder.Eval(Container.DataItem,"au_id") %></b><br> <!-- start child repeater --> <asp:repeater id="child" datasource='<%# ((DataRowView)Container.DataItem) .Row.GetChildRows("myrelation") %>' runat="server"> <itemtemplate> <%# DataBinder.Eval(Container.DataItem, "[/"title_id/"]")%><br> </itemtemplate> </asp:repeater> <!-- end child repeater --> </itemtemplate> </asp:repeater> <!-- end parent repeater --> </form> </body> </html> Nestedrepeater.aspx.cs using System; using System.Data; using System.Data.SqlClient; using System.Web; using System.Web.SessionState; using System.Web.UI; using System.Web.UI.WebControls; namespace yourprojectname { public class nestedrepeater : System.Web.UI.Page { protected System.Web.UI.WebControls.Repeater parent; public nestedrepeater() { Page.Init += new System.EventHandler(Page_Init); } public void Page_Load(object sender, EventArgs e) { //Create the connection and DataAdapter for the Authors table. SqlConnection cnn = new SqlConnection("server=(local);database=pubs;uid=sa;pwd=;"); SqlDataAdapter cmd1 = new SqlDataAdapter("select * from authors",cnn); //Create and fill the DataSet. DataSet ds = new DataSet(); cmd1.Fill(ds,"authors"); //Create a second DataAdapter for the Titles table. SqlDataAdapter cmd2 = new SqlDataAdapter("select * from titleauthor",cnn); cmd2.Fill(ds,"titles"); //Create the relation bewtween the Authors and Titles tables. ds.Relations.Add("myrelation", ds.Tables["authors"].Columns["au_id"], ds.Tables["titles"].Columns["au_id"]); //Bind the Authors table to the parent Repeater control, and call DataBind. parent.DataSource = ds.Tables["authors"]; Page.DataBind(); //Close the connection. cnn.Close(); } private void Page_Init(object sender, EventArgs e) { InitializeComponent(); } private void InitializeComponent() { this.Load += new System.EventHandler(this.Page_Load); } } } |
|
ASP.net:主表和子表数据同时在绑定控件显示
添加时间:2007-10-25
(一).显示效果图
(二)代码
1.前台界面代码:
<%@ Page language="c#" Codebehind="WebForm1.aspx.cs" AutoEventWireup="false" Inherits="数据绑定控件同时显示主表和子表数据.WebForm1" %>
<%@ Import Namespace="System.Data" %>
WebForm1
2. 后代代码
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 数据绑定控件同时显示主表和子表数据
{
///
/// 数据绑定控件同时显示主表和子表数据
///
public class WebForm1 : System.Web.UI.Page
{
protected System.Web.UI.WebControls.Repeater myRepeater;
private void Page_Load(object sender, System.EventArgs e)
{
DataSet ds = new DataSet();
//1.构造主表
DataTable dtTypeParent=new DataTable();
dtTypeParent.Columns.Add(new DataColumn("TypeID",typeof(int)));
dtTypeParent.Columns.Add(new DataColumn("TypeName",typeof(string)));
//给主表添加两条记录
DataRow drParent1 = dtTypeParent.NewRow();
drParent1["TypeID"] = 1;
drParent1["TypeName"] = "水果";
dtTypeParent.Rows.Add(drParent1);
DataRow drParent2 = dtTypeParent.NewRow();
drParent2["TypeID"] = 2;
drParent2["TypeName"] = "玩具";
dtTypeParent.Rows.Add(drParent2);
dtTypeParent.TableName="TypeParent";
dtTypeParent.PrimaryKey = new DataColumn[] {dtTypeParent.Columns["TypeID"]};
ds.Tables.Add(dtTypeParent);
//2.构造子表
DataTable dtTypeChild=new DataTable();
dtTypeChild.Columns.Add(new DataColumn("TypeID",typeof(int)));
dtTypeChild.Columns.Add(new DataColumn("TypeDetail",typeof(string)));
//给子表添加五条记录
DataRow drChild1 = dtTypeChild.NewRow();
drChild1["TypeID"] = 1;
drChild1["TypeDetail"] = "苹果";
dtTypeChild.Rows.Add(drChild1);
DataRow drChild2 = dtTypeChild.NewRow();
drChild2["TypeID"] = 1;
drChild2["TypeDetail"] = "桔子";
dtTypeChild.Rows.Add(drChild2);
DataRow drChild3 = dtTypeChild.NewRow();
drChild3["TypeID"] = 1;
drChild3["TypeDetail"] = "香蕉";
dtTypeChild.Rows.Add(drChild3);
DataRow drChild4 = dtTypeChild.NewRow();
drChild4["TypeID"] = 2;
drChild4["TypeDetail"] = "机器人";
dtTypeChild.Rows.Add(drChild4);
DataRow drChild5 = dtTypeChild.NewRow();
drChild5["TypeID"] = 2;
drChild5["TypeDetail"] = "小汽车";
dtTypeChild.Rows.Add(drChild5);
dtTypeChild.TableName="TypeChild";
ds.Tables.Add(dtTypeChild);
ds.Relations.Add("TypeRelation",
ds.Tables["TypeParent"].Columns["TypeID"],
ds.Tables["TypeChild"].Columns["TypeID"]);
myRepeater.DataSource = ds.Tables["TypeParent"];
Page.DataBind();
}
#region Web 窗体设计器生成的代码
override protected void OnInit(EventArgs e)
{
//
// CODEGEN: 该调用是 ASP.NET Web 窗体设计器所必需的。
//
InitializeComponent();
base.OnInit(e);
}
///
/// 设计器支持所需的方法 - 不要使用代码编辑器修改
/// 此方法的内容。
///
private void InitializeComponent()
{
this.Load += new System.EventHandler(this.Page_Load);
}
#endregion
}
}
Asp.net几个较复杂的显示数据控件(Repeater/DataList/DataGrid)用法 (示例代码下载)
(一). Asp.net Repeater控件
1. 示例图片
2. 用法代码下载
http://www.cnitblog.com/Files/ChengKing/Reapter.rar
(二). Asp.net DataList控件
2. 用法代码下载
http://www.cnitblog.com/Files/ChengKing/DataList.rar
(三). Asp.net DataGrid
说明: 这个控件我没必要再花时间去整理了,小山(singlepine) 已经做得非常棒了,下面是小山原创
1.示例图片
2. 代码下载
代码下载 数据库SQL脚本下载