数据绑定控件收藏 DropDownList ListBox GridView DataList Repeater FormView DetailsView

通过前面的例子我们看到每次我们要显示数据的时候都要通过一个循环来显示满足条件的数据,这是一个比较麻烦的过程,为此微软定义了一系列的控件专门用于显示数据的格式,通过这些控件可以以可视化的方式查看绑定数据之后的效果。这些控件称之为数据绑定控件。在asp.net中所有的数据库绑定控件都是从BaseDataBoundControl这个抽象类派生的,这个抽象类定义了几个重要属性和一个重要方法: DataSource属性:指定数据绑定控件的数据来源,显示的时候程序将会从这个数据源中获取数据并显示。 DataSourceID属性:指定数据绑定控件的数据源控件的ID, 显示的时候程序将会根据这个ID找到相应的数据源控件,并利用这个数据源控件中指定方法获取数据并显示。 DataBind()方法:当指定了数据绑定控件的DataSource属性或者DataSourceID属性之后,再调用DataBind()方法才会显示绑定的数据。并且在使用数据源时,会首先尝试使用DataSourceID属性标识的数据源,如果没有设置DataSourceID时才会用到DataSource属性标识的数据源。也就是说DataSource和DataSourceID两个属性不能同时使用。数据绑定控件的DataSource控件属性必须是一个可以枚举的数据源,如实现了ICollection、IEnumerable或IListSource接口的类的实例。 今天要讲述的内容有: DropDownList控件 ListBox控件 GridView控件 DataList控件 Repeater控件 FormView控件 DetailsView控件 DropDownList控件 DropDownList控件是一个相对比较简单的数据绑定控件,它在客户端被解释成这样的HTML标记,也就是只能有一个选项处于选中状态。 DropDownList控件常见属性: AutoPostBack属性:这个属性的用法在讲述基本控件的时候已经讲过,是用来设置当下拉列表项发生变化时是否主动向服务器提交整个表单,默认是false,即不主动提交。如果设置为true,就可以编写它的SelectedIndexChanged事件处理代码进行相关处理(注意:如果此属性为false即使编写了SelectedIndexChanged事件处理代码也不会马上起作用)。 DataTextField属性:设置列表项的可见部分的文字。 DataValueField属性:设置列表项的值部分。 Items属性:获取控件的列表项的集合。 SelectedIndex属性:获取或设置 DropDownList 控件中的选定项的索引。 SelectedItem属性:获取列表控件中索引最小的选定项。 SelectedValue属性:取列表控件中选定项的值,或选择列表控件中包含指定值的项。 因为在实际开发中,用户希望直观地看见选中哪个选项,而在操作数据库的时候我们更希望直接以该值对应的编号来操作,利用DataTextField属性和DataValueField属性就可以很方便地做到这一点,这两个属性通常是数据源中的某个字段名(如果DataSource属性是DataTable或者是DataView的话)或者范型集合中实体的属性(如果DataSource属性是System.Collections.Generic.List的话,则可以指定为T的属性)。下面是DropDownList控件的例子,依然用到的是第六章中创建的表(本代码采用了单页模式): 1.

2.

3.

4.

5.6. " 66. ); 67. } 68. } 69.} 页面的初始运行效果: 当一个也没有选择的时候点“删除”按钮之后的效果: 当选中一部分之后再点击“删除”的效果: 点击“确定”之后就会删除所有处于选中状态的用户,并且弹出删除成功的提示框,用户点击确定又会跳转到当前页面,显示删除选中用户之后的效果。 对上面的程序作如下说明: 1、在页面的前台代码中使用了几个javascript函数用于实现全选、反选和判断用户是否选择了至少一项及删除确认对话框的功能,“var checkbox = document.all.CheckboxGroup;”这句代码的作用是获取当前页面中所有name为”CheckboxGroup”的HTML控件,而我们在GridView中所有的实现选择的复选框的name属性就是”CheckboxGroup”。 2、在GridView中可以使用普通HTML控件或者asp.net服务器控件,并且可以对它们的值或者某个属性进行绑定。 DataList控件 DataList是一个相对复杂一点的数据绑定控件,它需要使用者自己定义数据的展现格式,也就是需要在html层控制数据的展示格式。和GridView控件每行只能显示一条记录不同,DataList可以在一行显示多条记录。 DataList支持以下模版:AlternatingItemTemplate、EditItemTemplate、FooterTemplate、HeaderTemplate、ItemTemplate和SelectedItemTemplate及SeparatorTemplate。其中AlternatingItemTemplate、EditItemTemplate、FooterTemplate和HeaderTemplate及ItemTemplate在TemplateField的支持的模版类型时已经介绍了,SelectedItemTemplatem模版是当该项处于选中状态的效果,SeparatorTemplate是各项之间分隔显示效果。 DataList有两个重要属性,如下: RepeatColumns:DataList中要显示的列数。默认是0,即按照RepeatDirection的设置单行或者单列显示数据。 RepeatDirection:DataList的显示方式,这个属性是一个枚举值,有Horizontal和Vertical两个值,分别代表水平和垂直显示。 在使用DataList时经常会嵌套绑定,所谓嵌套就是在一个数据绑定控件中嵌套着另一个数据绑定控件。下面演示一下DataList进行嵌套绑定的效果。在这个效果里,首先将UserInfo表中的数据按照性别分类,然后在每种性别里分别跳出三个用户显示。 首先向页面中添加一个DataList控件,如下图: 点击“模版”,在它的ItemTemplate模版中再添加一个Label控件和一个DataList控件,如下图: 对上述操作生成的前台代码我们做一些修改,如下: 1.

2.3.

4.5. 6. 7. 8. 9. 10.

11.
12. 13. 14.
15. 16. 17.
18. 19. 20. 21. 22. 23. 24.
25.

26. 27.后台代码如下: 1.using System; 2.using System.Data; 3.using System.Configuration; 4.using System.Collections; 5.using System.Web; 6.using System.Web.Security; 7.using System.Web.UI; 8.using System.Web.UI.WebControls; 9.using System.Web.UI.WebControls.WebParts; 10.using System.Web.UI.HtmlControls; 11.using System.Data.SqlClient; 12.13.public partial class DataListDemo : System.Web.UI.Page 14.{ 15. protected void Page_Load(object sender, EventArgs e) 16. { 17. if (!Page.IsPostBack) 18. { 19. BindSex(); 20. } 21. } 22. //绑定顶级项目 23. private void BindSex() 24. { 25. SqlConnection connection = new SqlConnection("Data Source=(local);Initial Catalog=AspNetStudy;Persist Security Info=True;User ID=sa;Password=sa"); 26. SqlCommand command = new SqlCommand("select distinct sex from UserInfo", connection); 27. SqlDataAdapter adapter = new SqlDataAdapter(command); 28. DataTable data = new DataTable(); 29. adapter.Fill(data); 30.31. DataList1.DataSource = data; 32. DataList1.DataBind(); 33. } 34. //当绑定DataList1中的每一项时的处理方法 35. protected void DataList1_ItemDataBound(object sender, DataListItemEventArgs e) 36. { 37. //如果要绑定的项是交替项或者是普通项 38. //注意此外还有脚模板和脚模版 39. if (e.Item.ItemType == ListItemType.Item || 40. e.Item.ItemType == ListItemType.AlternatingItem) 41. { 42. //e.Item表示当前绑定的那一行 43. //利用e.Item.FindControl("Label1")来找到那一行的id为"Label1"的Label控件 44. Label lbSex = (Label)(e.Item.FindControl("Label1")); 45. //利用e.Item.FindControl("Label1")来找到那一行的id为"Label1"的Label控件 46. DataList dl2 = (DataList)(e.Item.FindControl("DataList2")); 47.48. bool male = bool.Parse(lbSex.Text); 49. dl2.DataSource = GetDataTable(male); 50. dl2.DataBind(); 51. } 52. } 53. /// 54. /// 根据性别来查找符合条件的用户 55. /// 56. /// 是否为男性 57. /// 58. private DataTable GetDataTable(bool male) 59. { 60. SqlConnection connection = new SqlConnection("Data Source=(local);Initial Catalog=AspNetStudy;Persist Security Info=True;User ID=sa;Password=sa"); 61. SqlCommand command = new SqlCommand("select top 3 RealName from UserInfo where Sex=@Sex order by UserID", connection); 62. command.Parameters.AddWithValue("@Sex", male);//添加SqlParameter参数 63. SqlDataAdapter adapter = new SqlDataAdapter(command); 64. DataTable data = new DataTable(); 65. adapter.Fill(data); 66. return data; 67. } 68.} 页面的最后运行效果: 对上面的程序代码作几点说明: (1)在上面的代码中使用了两个DataList控件,其中第二个是位于第一个的ItemTemplate模版里面,这个用于绑定符合当前项中条件的数据,并且我们在第一个的ItemTemplate里面还用到了一个Label控件,这个Label是不可见的(Visible="false"),使用这个控件并不是为了显示数据,而是为了保存第二个DataList要绑定显示的数据的条件。在这里我们是以性别作为顶级分类的,其实这个没有必要在数据库查询并进行绑定显示,这里只是通过这种方法来演示DataList如何进行嵌套绑定。 (2)在嵌套绑定的时候我们利用了DataList的ItemDataBound事件,在绑定DataList中的每一项时候都会激发这个事件,当要绑定的项是普通项或者是交替项时,项模版里就有要显示子数据的DataList控件和我们隐藏Label控件,我们利用FindControl()方法找到这两个控件,利用Label的Text属性值作为条件去数据库查找满足条件的数据,并将返回的数据源绑定到第二个DataList上,这样就完成了DataList的嵌套绑定。 Repeater控件 Repeater控件的用法类似于DataList控件,只不过它不能在一行显示多行数据,不过它可以让我们更灵活地控制数据的显示样式。如果Repeater控件中没有定义模版或者模版中没有定义要显示的数据的显示方式,那么在运行时该控件在页面上不会有任何显示。 Repeater服务器控件支持的模版有ItemTemplate、AlternatingItemTemplate、HeaderTemplate和FooterTemplate及SeparatorTemplate,这些模版的用法类似于DataList中对应的模版的用法。 下面是Repeater控件的用法的例子。 首先在页面中拖入一个Repeater控件,拖入Repeater控件之后页面的设计效果如下: 可以看出使用Repeater控件时没有办法在设计视图下编辑控件模版,要编辑控件模版需要切换到源视图。 在ADO.NET一节笔者展示了如何用Table来显示数据,具体做法是现在循环之前输出表头,然后在利用循环输出数据集合中的每条数据,最后在循环结束之后输出table的结束标记。如果在Repeater中想用Table的形式显示数据,我们的做法是如下: 先在HeaderTemplate模版中定义表头,然后在ItemTemplate模版或AlternatingItemTemplate模版中定义数据的每条数据的显示方式,最后在FooterTemplate模版中定义table的结束标记。 下面是前台代码: 1.

2.3.

4.5. 6. 7. 8. 9. 10.

11.
12. 13. 14.
15.
编号真实姓名年龄性别手机电话电子邮件
16. 17. 18.
19. 20. 21.
22. 23. 24. 25. 26. 27.
28.

29. 30.下面是后台代码: 1.using System; 2.using System.Data; 3.using System.Configuration; 4.using System.Collections; 5.using System.Web; 6.using System.Web.Security; 7.using System.Web.UI; 8.using System.Web.UI.WebControls; 9.using System.Web.UI.WebControls.WebParts; 10.using System.Web.UI.HtmlControls; 11.using System.Data.SqlClient; 12.13.public partial class RepeaterDemo : System.Web.UI.Page 14.{ 15. protected void Page_Load(object sender, EventArgs e) 16. { 17. //仅当页面不是由页面的服务器控件提交表单而导致的页面加载才会绑定数据 18. if (!Page.IsPostBack) 19. { 20. //实例化Connection对象 21. SqlConnection connection = new SqlConnection("Data Source=(local);Initial Catalog=AspNetStudy;Persist Security Info=True;User ID=sa;Password=sa"); 22. //实例化Command对象 23. string sql="select top 5 * from UserInfo order by UserID desc"; 24. SqlDataAdapter adapter = new SqlDataAdapter(sql, connection); 25. DataTable data = new DataTable(); 26. adapter.Fill(data); 27.28. Repeater1.DataSource = data; 29. Repeater1.DataBind(); 30. } 31. } 32.} 以下是页面的显示效果: 在这里例子里我们定义了交替项的显示效果,偶数行的编号是以文本框的形式展示,并且我们对用户性别做了处理之后才显示。 前面讲到的GridView和DataList及Repeater控件是用来批量显示数据的,在这种情况下只显示数据库记录的概要信息,比如要显示论坛某个版块下的文章列表时肯定不会同时将文章内容页也是显示出来(为了提高查询效率实际开发中文章内容字段都不会出现在select查询SQL语句的字段列表中)。如果用户对某条记录感兴趣可以点击给定的超级链接来查看。这时我们就可以利用FormView或者DetailsView控件,它们就是用来显示单条记录的详细信息的。 FormView控件 Form控件的用法和Repeater控件的用法非常类似,它支持模版类型有EditItemTemplate、EmptyDataTemplate、FooterTemplate、HeaderTemplate、ItemTemplate和InsertItemTemplate、PagerTemplate,注意这里没有AlternatingItemTemplate模版(就一条记录自然就不会有什么奇偶行效果了)。 FormView 控件支持以下功能: 绑定到数据源控件,如 SqlDataSource 和 ObjectDataSource。 内置插入功能。 内置更新和删除功能。 内置分页功能。 以编程方式访问 FormView 对象模型以动态设置属性、处理事件等。 可通过用户定义的模板、主题和样式自定义外观。 需要特别说明的是笔者只是说FormView 控件一次只能显示一条数据,但是如果绑定的数据源有多条记录的时候,默认是显示第一条记录,但是还能支持像GridView那样分页显示数据源中的每条记录。 下面是FormView用法的例子,在本例中设置了允许分页显示,前台代码如下: 1.

2.3.

4.5. 6. 7. 8. 9. 10.

11.
12. 13. 14.
15.
编号真实姓名年龄性别手机电话电子邮件
16. 17. 18.
19. 20. 21. 22. 23. 24.
25.

26. 27.后台代码如下: 1.using System; 2.using System.Data; 3.using System.Configuration; 4.using System.Collections; 5.using System.Web; 6.using System.Web.Security; 7.using System.Web.UI; 8.using System.Web.UI.WebControls; 9.using System.Web.UI.WebControls.WebParts; 10.using System.Web.UI.HtmlControls; 11.using System.Data.SqlClient; 12.13.public partial class FormViewDemo : System.Web.UI.Page 14.{ 15. protected void Page_Load(object sender, EventArgs e) 16. { 17. if (!Page.IsPostBack) 18. { 19. BindData(0); 20. } 21. } 22. private void BindData(int pageIndex) 23. { 24. //实例化Connection对象 25. SqlConnection connection = new SqlConnection("Data Source=(local);Initial Catalog=AspNetStudy;Persist Security Info=True;User ID=sa;Password=sa"); 26. //实例化Command对象 27. string sql = "select top 5 * from UserInfo order by UserID desc"; 28. SqlDataAdapter adapter = new SqlDataAdapter(sql, connection); 29. DataTable data = new DataTable(); 30. adapter.Fill(data); 31.32. FormView1.DataSource = data; 33. FormView1.PageIndex = pageIndex; 34. FormView1.DataBind(); 35. } 36. protected void FormView1_PageIndexChanging(object sender, FormViewPageEventArgs e) 37. { 38. BindData(e.NewPageIndex); 39. } 40.} 下面是运行效果: DetailsView控件 DetailsView控件主要是以表格的形式来显示和处理来自数据源的单条数据。它支持绑定功能(即可以使用DataBind()方法)和分页及编辑等功能,它一般与GridView控件搭配使用,用GridView控件显示数据记录列表,用DetailsView显示某条记录的详细信息。DetailsView控件的用法也很类似于GridView控件。 下面是DetailsView控件控件的例子。 前台代码如下: 1.

2.3.

4.5. 6. 7. 8. 9. 10.

11.
12. 13. 14. 15. 17. 18. 19. 20. 21. 22. 23. 24. 发电子给 25. 26. 27. 28. 29. 30. 31. 32. 温馨提示:当前没有任何记录哦。 33. 34. 35. 36.
37.

38. 39.后台代码如下: 1.using System; 2.using System.Data; 3.using System.Configuration; 4.using System.Collections; 5.using System.Web; 6.using System.Web.Security; 7.using System.Web.UI; 8.using System.Web.UI.WebControls; 9.using System.Web.UI.WebControls.WebParts; 10.using System.Web.UI.HtmlControls; 11.using System.Data.SqlClient; 12.13.public partial class DetailsViewDemo : System.Web.UI.Page 14.{ 15. protected void Page_Load(object sender, EventArgs e) 16. { 17. if (!Page.IsPostBack) 18. { 19. int userId; 20. //当当前URL地址中含有"UserId"参数并且能转换成数字时 21. if (int.TryParse(Request.QueryString["UserId"], out userId)) 22. { 23. //实例化Connection对象 24. SqlConnection connection = new SqlConnection("Data Source=(local);Initial Catalog=AspNetStudy;Persist Security Info=True;User ID=sa;Password=sa"); 25. //实例化Command对象 26. SqlCommand command = new SqlCommand("select * from UserInfo where UserId=@UserId", connection); 27. command.Parameters.AddWithValue("@UserId", userId);//添加Parameter参数 28. SqlDataAdapter adapter = new SqlDataAdapter(command); 29. DataTable data = new DataTable(); 30. adapter.Fill(data); 31.32. DetailsView1.DataSource = data; 33. DetailsView1.DataBind(); 34. } 35. else 36. { 37. //如果不能转换成数字,生成一个空DataTable对象来绑定 38. //因为我们在设计代码中定义如果没有符合条件的数据时的显示效果 39. //所以此时会显示我们定义的没有数据时的效果 40. DataTable data = new DataTable(); 41. DetailsView1.DataSource = data; 42. DetailsView1.DataBind(); 43. } 44. } 45. } 46.} 还记得前面使用GridView显示数据的例子吗?我们可以从那里开始,因为在前面的GridView例子中我们定义了一个查看数据详情的超级链接的例子,那里我们还使用了一个HyperLinkField,它的定义如下: 1.我们就GridView开始查看所有的记录,然后选择任意一条记录查看详细信息(这里选择查看周公也就是我的个人信息),效果如下: (注:本系列文章所有有关联系信息都是虚假的,请读者朋友不要当真,所以我的信息除了年龄之外也都是假的:P) 因为我们还定义了没有满足条件的情况的提示信息,所以如果不提供任何参数或者找不到相关记录的时候,会看到如下效果: 另外说明一下,笔者实际开发中用到FormView和DetailsView控件的机会很小,因为一般都将添加和编辑功能放到一个页面中了,而且能比较方便地使用下一篇要介绍的验证控件。 总结: GridView、DataList和Repeater控件适合一次性显示多条数据概要的情况下,它们对呈现数据的控制能力是GridView较弱,DataList次之,Repeater因为使用者完全可以自己编写呈现的HTML代码来控制呈现方式所以对数据呈现方式方面控制最强,在使用便捷性上来说GridView因为内置了表格呈现样式并且了内置了分页和排序等方面的功能所以较容易操作,DataList次之,Repeater因为使用者完全自己编写呈现的HTML代码所以较难使用。如果仅仅呈现一下数据,可以考虑使用GridView控件,如果需要将数据分成多列显示只能使用DataList控件,如果想使用复杂的呈现方式则可以考虑使用Repeater控件。 FormView与DetailsView控件有很多相似的地方,二者都是用来显示某一详细记录,都是只能显示一条数据源中的记录。并且都具有分页的能力。并且都支持显示、编辑和添加等功能。但是二者也有不同点:具体表现在DetailsView内置了表格呈现样式,并且显示相关数据的字段名称和数据值。FormView则需要自己写相关的HTML代码。另外,DetailsView有AutoGenerateField属性或者自定义Fileds属性,控件能够自动创建相关模版属性,而FormView控件的呈现形式完全依赖模版设置。另外一般来说DetailsView控件将数据源中的每一个字段用一行来显示,而FormView控件将数据源中每一条记录用一行来显示。 因为去北京参加MVP Open Day活动在北京呆了几天,在北京的几天没有时间来写文章(可以看本人的《MVP Open Day趣事记》看看本人在北京发生了哪些有趣的事情),加上微软山西.net俱乐部最近再搞一系列走进高校的活动,所以时间比较少,所以本月写的夜话比较少,看到不少朋友在我的博客上留言鼓励和催下篇,很受鼓舞也很感动,昨夜我写到今早3点才睡,早晨7点半又爬起来上班了。我初步排了一个计划,大概这个夜话系列会有21篇左右的文章,我计划在元旦前写完,压力很大,不过我动力更大:)能让更多的人从这个系列的文章中学到知识就是我最大的动力! 另外,如果大家对这个系列有什么好的建议或者很希望我来讲述有关asp.net中的某些知识点,请在我的博客http://blog.csdn.net/zhoufoxcn留言告诉我,我一定会尽量满足大家的要求。 本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/txl816/archive/2008/10/27/3158796.aspx 本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/txl816/archive/2008/10/27/3158796.aspx 本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/txl816/archive/2008/10/27/3158796.aspx 本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/txl816/archive/2008/10/27/3158796.aspx

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值