当前位置: 首页 > 图文教程 > 网络编程 > ASP.NET > ASP.NET立即上手教程(12)

ASP.NET
FreeTextBox(版本3.1.6)在ASP.Net 2.0中使用方法
.NET 常用功能和代码小结
在 .NET Framework 2.0 中未处理的异常导致基于 ASP.NET 的应用程序意外退出
asp.net IList查询数据后格式化数据再绑定控件
asp.net sql存储过程
asp.net 简单实现禁用或启用页面中的某一类型的控件
asp.net(c#)获取内容第一张图片地址的函数
The remote procedure call failed and did not execute的解决办法
ASP.NET 在线文件管理
asp.net 读取并修改config文件实现代码
ASP.NET Cookie 操作实现
asp.net Silverlight中的模式窗体
Silverlight中动态获取Web Service地址
asp.net Silverlight应用程序中获取载体aspx页面参数
asp.net 水晶报表隔行换色实现方法
asp.net 获取Gridview隐藏列的值
手动把asp.net的类生成dll文件的方法
asp.net 使用ObjectDataSource控件在ASP.NET中实现Ajax真分页
动态指定任意类型的ObjectDataSource对象的查询参数
asp.net Md5的用法小结

ASP.NET立即上手教程(12)


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-08-14   浏览: 69 ::
收藏到网摘: n/a

数据访问和定制

模板控件介绍

前面几个章节演示的DataGrid控件,对于许多需要使用类似表格那样来展示数据的web应用程序来说是非常适合的。但许多时候,需要用更丰富的形式来显示数据。Asp.net提供了两个控件,DataList和Repeater,对于类似列表的数据提供了非常灵活的控制方式。这两个控件是基于模板的,所以没有自己默认的表现。实施数据的方法完全由控件模板的执行,该模板描述如何呈现数据项目。

类似于DataGrid控件,DataList 和 Repeater支持DataSource属性,该属性可以被设置为任何ICollection, IEnumerable, 或 IListSource类型。DataSource(数据源)中的数据可以使用DataBind方法来绑定。数据一旦被绑定,每个数据项的格式就可以由模板来描述。

ItemTemplate 属性控制数据源集合中每个项目的展现。在ItemTemplate内部,你可以定义任意的表达代码(HTML 或者其他)。

使用ASP.NET 的数据绑定语法,你可以从数据绑定中插入值到DataList 或 Repeater控件,就象下面这样。

Container 从名称空间System.Web.UI.INamingContainer 直接继承。在这种情况下,Container 解析为一个System.Web.UI.WebControls.RepeaterItem类型的对象,他有一个DataItem属性。 就像Repeater 重复数据源集合一样,DataItem 包含该集合中的当前项。例如,如果雇员字段对象的数据源被设定为ArrayList,DataItem 就是雇员类型的。当绑定到DataView,DataItem 则是DataRowView类型 。

下面的例子演示了一个Repeater 控件绑定到DataView (从sql查询返回)。同时定义了两个模板:HeaderTemplate 和 FooterTemplate ,分别用来展示列表的开头和结尾。

Repeater控件用来重复数据源集合中的数据,为数据源集合中的每一个项目使用一次ItemTemplate,但是不显示任何没有包含在模板中的元素。相对于Repeater的重复数据, DataList提供了一些额外的功能来控制列表的布局。与Repeater不同,DataList 使用额外的语法元素,如包含风格属性的表的行、列和跨列等等,在模板定义之外来丰富外观的格式。例如,DataList支持RepeatColumns 和 RepeatDirection 属性,分别用来指定数据是否以多列的样式显示,以及优先排列的方向(水平或者垂直) DataList 也支持样式属性,如下面的代码:

以下为引用的内容:
<ASP:DataList runat="server" DataSource="<%#MyData%>"
  RepeatColumns="2"
  RepeatDirection="Horizontal"
  ItemStyle-Font-Size="10pt"
  ItemStyle-Font-Name="Verdana"
>
  ...
</ASP:DataList>

注意:本章的剩余部分集中讲解了DataList控件的许多功能。Repeater 空间的更多信息,参考本教材中“web form 控件参考”章节中的“repeater”主题。

下面的例子演示了DataList控件的用法。注意数据项的外观已经和上一个例子中的有所不同,其实仅仅改变了一下控件ItemTemplate的属性。RepeatDirection 和 RepeatColumns属性决定了ItemTemplates的显示样式。

下面的例子更进一步演示了通过改变ItemTemplate来达到模板的多姿多彩的变化。这次,DataItem的一个值使用<img>标签的"src"属性来替代。DataBinder.Eval的格式化字符串参数也在URL查询字符串中替换了DataItem的值。

处理模板中的返回

如同在DataGrid一样,你可以从DataList模板激活一条命令,该模板通过绑定到DataList自身来传递事件句柄。例如,ItemTemplate中的LinkButton可以激活Select命令。通过设定DataList的OnSelectedIndexChanged属性,能够调用一个事件句柄来响应这条命令。请看下面的代码:

以下为引用的内容:
<ASP:DataList id="MyDataList" OnSelectedIndexChanged="MyDataList_Select" runat="server">
  <ItemTemplate>
    <asp:linkbutton CommandName="Select" runat="server">
      <%# DataBinder.Eval(Container.DataItem, "title") %>
    </asp:linkbutton>
  </ItemTemplate>
</ASP:DataList>

在MyDataList_Select 事件句柄中,组合了几个其他的服务器控件,来表述被选中项目的详细资料。

注意,当DataList辨别一些特定的命令如Select和 Edit/Update/Cancel的时候,在模板中激活的命令字符串可以是任意的字符串。对于所有的命令, DataList的OnItemCommand 被激活。就像上面的例子一样,你可以绑定这个事件到事件句柄。

以下为引用的内容:
<script runat="server">
  protected void MyDataList_ItemCommand(Object sender, DataListCommandEventArgs e) {
    String command = e.CommandName;
    switch(command) {
     case "Discussions":
      ShowDiscussions((DataRowView)e.Item.DataItem); break;
     case "Ratings":
      ShowRatings((DataRowView)e.Item.DataItem); break;
    }
  }
</script>
<ASP:DataList id="MyDataList" OnItemCommand="MyDataList_ItemCommand" runat="server">
  <ItemTemplate>
    <asp:linkbutton CommandName="Ratings" runat="server">
      View Ratings
    </asp:linkbutton>
     <asp:linkbutton CommandName="Discuss" runat="server">
      View Discussions
    </asp:linkbutton>
  </ItemTemplate>
</ASP:DataList>

注意,由于不仅一个命令可以激活这个事件句柄,所以你必须使用选择语句来决定具体的命令。

使用选择和编辑模板

除了使用页面级的事件句柄来处理Select命令以外,也可以使用DataList来内部处理这种事件。如果为DataList定义了一个SelectedItemTemplate,DataList就会通过激活Select命令的数据项来实施这个模板。下面的例子中使用SelectedItemTemplate来使被选择的书名标题字体加粗。

DataList 还支持EditItemTemplate,来编辑索引值等于DataList的EditItemIndex属性的项目。关于编辑和更新工作的细节问题,参考本教材中“数据访问”章的“更新数据”主题。

在模板中查找控件

有些时候,我们很有必要查找包含在模板中的控件。如果在模板中给定了控件的ID号,那么就可以从他的容器(支持InamingContainer的父层中的第一个控件)中取得他的有关信息。在这种情况下,容器是DataListItem控件。注意,即使几个控件具有相同的ID号(具有DataList的循环优点),每一个也是被逻辑的包含在DataListItem容器控件的名称空间中。

你能够通过遍历DataList的Items集合来取得DataListItem,然后调用DataListItem的 FindControl方法(从Control基类继承而来)取回具有特定ID号的控件。

以下为引用的内容:
<script runat="server">
  public void Page_Load(Object sender, EventArgs E)) {
    // set datasource and call databind here
    for (int i=0; i<MyDataList.Items.Count; i++) {
      String isChecked = ((CheckBox) MyDataList.Items[i].FindControl("Save")).Checked.ToString();
      If (isChecked == "True") {
       ...
      }
    }
  }
</script>
<ASP:DataList id="MyDataList" runat="server">
  <ItemTemplate>
     <asp:CheckBox id="Save" runat="server"/> <b>Save to Favorites</b>
  </ItemTemplate>
</ASP:DataList>

下面的例子演示了刚才的技术。

本章小结
1、DataList和Repeater提供给开发者微调数据绑定列表的外观显示格式。

2、使用模板来表现绑定数据的显示,例如HeaderTemplate、FooterTemplate、或者ItemTemplate 。

3、Repeater控件是一般目的的重复,他的模板中没有的东西,都不会显示。

4、DataList 控件对项目的布局和样式提供了更多的控制,可以格式化输出自己的表现代码。

5、DataList 支持Select, Edit/Update/Cancel,以及 Item Command 事件。通过绑定事件句柄到DataList的 Command 事件,可以在页面级别处理Item Command。

6、DataList支持SelectedItemTemplate 和 EditItemTemplate 两个模板, 用来控制选定时的样式和编辑时的表现样式。

7、使用Control.FindControl方法,可以通过程序来取得模板中的控件。该方法通过DataList的项目集合 DataListItem调用。