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

ASP.NET
使用函数传递参数来执行相应的数据库操作
如何实现在窗体和窗体之间进行传递数据
ASP.NET中文显示之两种解决方法
ASP.NET、JSP及PHP之间的抉择
ASP.NET 2.0发送电子邮件中存在的问题
谈谈HtmlControl与WebControl的区别与用途
从ASP.NET 1.1升级到ASP.NET 2.0要考虑的Cookie问题
通过系统配置来提高ASP.NET应用程序的稳定性
妙用ASP2.0中的URL映射改变网址
AJAX实现web页面中级联菜单的设计
ASP.NET跨页面传值技巧总结
再议ASP.NET DataGrid控件中的“添加新行”功能
Geometry 对象浅析
重构CollapsibleSplitter
如何利用.NET Framework使用RSS feed
ASP.NET获取IP与MAC地址的方法
在ASP.NET 2.0中使用样式、主题和皮肤
ASP.NET中为GridView添加删除提示框
ASP.NET 2.0,无刷新页面新境界
看看一个.net版对话框控件

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


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-08-14   浏览: 56 ::
收藏到网摘: 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调用。