ListView详解(二)

来源:互联网 发布:c语言sdl小游戏 编辑:程序博客网 时间:2024/05/18 15:06

 

(原创:灰灰虫的家http://hi.baidu.com/grayworm)
五、分页
在GridView中,分页一般有两种方式:一种是利用GridView自身带有的分页功能与DataSource控件配合使用实现分页。这种分页方式几乎不用编写代码,实现简单,但它是把所有数据读取到内存中进行分页,对于大数据量的操作销耗内存较大,即使使用缓存技术,其性能也是很低;并且这种分页的导航与GridView集成在一起,导般模式太单调。另一种分页方式就是使用子查询或LInQ实现自定义分页,仅从数据库中检索当前页的数据返回,并自己制作分页导航界面实现分页功能。这种方式性能很高,界面也可以做得比较人性化,但复杂度较高,实现起来比较麻烦,在Repeater和DataList中我们一般使用这种方式进行分页(当然你还可以使用 PagedDataSource组件,它的实现原理与GridView一样,这里不单独列出来)。
在VS2008中为我们提供了一个分页工具DataPager控件,它把分页功能单独封装起来,我们把数据显示控件( Repeater/DataList/GridView/ListView)、数据源控件(SqlDataSource/ObjectDataSource等)和DataPager结合起使用就可以很简单地实现高效的分页功能。
两个常用的属性:
PagedControlID
:要分页显示数据的控件,一般是Repeater、DataList、GridView、ListView等。
PageSize:每页的记录数

1.DataPager与SqlDataSource控件一起使用。
这种模式实现的分页仍然是把所有的数据都读取到内存中然后进行分页
,对于数据总量不大,并可以预计情况(如:显示一个班的成绩)使用这种方式是可以的。但对于数据量庞大,并且不知道数据总量将膨胀到什么地步的情况下,千万不能使用这种方式。
这种方式实现起来很简单。
第一步:设计ListView模板,并把它与SqlDataSource控件一起绑定显示数据
第二步:把DataPager控件放在页面上(可以放在ListView的外面,也可以放在ListView的LayoutTemplate模板中)。
第三步:设置DataPager控件的两个属性:PagedControlID 和 PageSize。
第四步:设计DataPager的导航模式。一般DataPager有两种常用的导航模式(“上一页/下一页”和“数字页号”),另外还有一种模板导航模式。



   《图19》
   这几种导航模式可以同时混合使用如下图:



   《图20》
这样就可以实现分页功能了



   《图21》

2.DataPager与ObjectDataSource控件一起使用
这种使用方式可出现两种分页情况,一种情况就是像DataPager与SqlDataSource控件配合使用一样,把所有数据检索到内存中再进行分页,这种方式我们不再做讲解了。另一种情况就是每次换页的时候,只检索出要显示的数据,下面重点讲述这种方式。
要实现自定义分页,关键是如何配置ObjectDataSource控件向界面提供当前页的数据。
大家都知道ObjectDataSource控件不直接访问数据库,而是通过调用业务对象中的方法实现对数据库的操作。要实现自定义分页,那ObjectDataSource控件的这个业务对象必须要包含两个方法:
a.一个方法接收两个整型输入参数,返回集合类型。这两个参数分别是:“本页首行数据的索引号(从0开始)”和“每页最多显示的数据条数”。返回的是当前页的数据集合。
   b.另一个方法也接收上面两个整型输入参数,参数意义与上面方法一样,返回整型值。该整型值就是当前数据集的总记录条数。

   代码如下:



   《图22》
需要注意的是:上面方法中的两个参数的名子不能随便命名,这两个参数的名子必须与ObjectDataSource 控件的StartRowIndexParameterName属性值和MaximumRowsParameterName属性值相对应。



   《图23》

看懂了这些后,下面我们一步一步来实现自定义分页。
a.定义ObjectDataSource要调用的业务对象CarBll(如图22)
   b.设置ObejctDataSource控件的EnablePaging=True;
   c.设置ObjectDataSource控件的TypeName为业务对象的类名CallBll
   d.设置ObjectDataSource控件的SelectMethod属性为业务对象的两个方法中的第一个方法名(即返回结果集的那个方法)
   e.设置ObjectDataSource控件的SelectCountMethod属性为业务对象的两个方法中的第二个方法名(即返回整型值的那个方法)
   f.检查StartRowIndexParameterName属性值是否与业务对象方法的第一个参数名一致;MaximumRowsParameterName属性值是否与业务对象方法的第二个参数名一致
   g.制作ListView的模板,并设置其DataSourceID属性为ObjectDataSource控件的ID
   h.把DataPager控件拖到页面上
   i.设置DataPager控件的导航外观
   j.设置DataPager控件的PagedControlID为ListView控件的ID,PageSize数性为页的大小。
   k.运行页面出现我们的运行结果。

上面就是我们使用ListView+ObjectDataSource+DataPager控件来实现自定义分页。

六、增、删、改
在这个例子中我在业务逻辑层使用Linq To Sql 来实现数据库的增、删、改操作,代码如下:



《图30》

(原创:灰灰虫的家http://hi.baidu.com/grayworm)

(一)新增数据
与GridView不同的是ListView为我们提供了添加数据的功能,通过InsertItemTemplate来定义添加数据的界面,在运行的时候就可以在ListView的顶端或底端出现添加InsertItemTemplate的界面。

要在ListView中实现新增数据,需要实现两个关键的步骤:
1.定义InsertItemTemplate模板
2.为ListView的InsertItemPosition属性赋值,指定新增模板显示的位置。FistItem-顶端,LastItem-底端,None-不显示

首先、我们来看如何定义InsertItemTemplate



《图24》
为了简单起见,插入模板中的输入界面全都使用文本框做。文本框的Text属性双向绑定至DataSource控件。“Insert”按钮的CommandName="Insert",“Cancel”按钮的CommandName="Cancel"。
当输入内容后点击“Insert”按钮时,会产生以下操作
1.ListView控件触发ItemInserting事件
2.ListView的新增输入界面中的数据传递给DataSource控件的对应参数。
3.ListView调用对应DataSource控件的插入方法,执行插入操作。
4.ListView触发ItemInserted事件
5.ListView重新绑数据源
6.输入界面中文本框重置
然后、设置ListView的InsertItemPosition属性为Last,让添加模板显示在列表的最下面。

运行界面如图:



《图25》

上面虽然能够实现添加功能,但是输入界面不合理,比如:没有非空验证,日期格式没加验证,性别应当使用单选按钮形式,民族应当使用下拉列表形式表现。
下面我们对添加界面做一个修改:
第一步、对代号、姓名和生日加入非空验证。
<asp:RequiredFieldValidator ID="rfvCode" runat="server" ForeColor="Red" ErrorMessage="代号不能为空" Display="Dynamic" ControlToValidate="CodeTextBox"></asp:RequiredFieldValidator>
<asp:RequiredFieldValidator ID="rfvName" runat="server" ForeColor="Red" ErrorMessage="姓名不能为空" Display="Dynamic" ControlToValidate="NameTextBox"></asp:RequiredFieldValidator>
<asp:RequiredFieldValidator ID="rfvBirthday" runat="server" ForeColor="Red" ErrorMessage="生日不能为空" Display="Dynamic" ControlToValidate="BirthdayTextBox"></asp:RequiredFieldValidator>
第二步、对生日加入范围验证。
<asp:RangeValidator ID="rvBirthday" runat="server"
     ErrorMessage="生日应在1900-1-1至2999-12-31之间"
     Display = "Dynamic"
     ControlToValidate="BirthdayTextBox"
     Type="Date"
     MaximumValue="2999-12-31"
     MinimumValue="1900-1-1"
     ForeColor="Red"
></asp:RangeValidator>
第三步、对性别输入界面修改为单选按钮形式
<asp:RadioButtonList ID="SexRadioButton" runat="server" RepeatDirection="Horizontal" RepeatLayout="Flow"SelectedValue='<%# Bind("Sex") %>'>
        <asp:ListItem Text="男" Value="True" Selected="True"></asp:ListItem>
        <asp:ListItem Text="女" Value="False"></asp:ListItem>
    </asp:RadioButtonList>
第四步、把民族修改为下拉列表形式。
<asp:DropDownList ID="NationDropDownList" runat="server" AppendDataBoundItems="True" DataSourceID="ObjectDataSource2" DataTextField="Name" DataValueField="Code"SelectedValue='<%# Bind("Nation") %>' >
     <asp:ListItem Text="请选择" Value="-1" Selected="True"></asp:ListItem>
</asp:DropDownList>
<asp:ObjectDataSource ID="ObjectDataSource2" runat="server" TypeName="HRBF" SelectMethod="GetAllNations"></asp:ObjectDataSource>
对于民族下拉列表有点复杂,我们首先使用ObjectDataSource2 控件向下拉列表中加载民族的数据,然后又把民族下拉列表的SelectedValue绑定到ObjectDataSource1的InsertParameter上。如果你使用的.NET Framework3.5的话,会产生错误信息:
System.InvalidOperationException:Databinding methods such as Eval(),XPath(),and Bind() can only be used in the context of a databound control
这是.NET Framework3.5中的一个Bug,并不是我们代码的问题。微软已经在.NET Framework4.0中修改了此错误。本例子我是使用.NET Framework4.0实现的,所以能够正常运行。
如果你正在使用的.NET Framework3.5的话,那就不能直接在<asp:DropDownList>中使用SelectedValue='Bind("Nation")'来绑定数据了,需要你在ItemInserting事件中手动为e.Values["Nation"]进行赋值。

修改后的运行效果:



《图26》

(二)修改数据
ListView像GridView一样为我们提供了修改数据的功能,对于修改数据一共涉及到两个模板(ItemTemplate 和 EditItemTemplate)、三个按钮(编辑、更新、取消)。“编辑”按钮应当放在ItemTemplate中,“更新”“取消”按钮就非常好放在EditItemTemplate中。

当点击“编辑”按钮时,ListView会产生以下操作:
1.ListView触发ItemEditing事件。
2.ListView把被点击的“编辑”按钮所在行的索引号赋给ListView.EditIndex
3.ListView重新绑定数据源
4.索引号等于ListView.EditIndex的行,用EditItemTemplate模板替换ItemTemplate呈显出来。出现修改界面

当点击“更新”按钮时,ListView会产生以下操作:
1.ListView触发ItemUpdating事件
2.ListView把编辑界面输入框的内容赋值给DataSource控件中对应的UpdateParameter
3.ListView调用对应DataSource控件的Update方法,执行数据库的更新操作
4.触发ItemUpdated事件
5.将ListView的EditIndex属性设为-1
6.ListView重新绑定数据
7.ListView退出编辑状态,以ItemTemplate显示修改完的数据。

当点击“取消”按钮时,ListView会产生以下操作:
1.ListView触发ItemCanceling事件
2.ListView把ListView.EditIndex设为-1
3.ListView重新绑定数据源
4.所有数据都使用ItemTemplate绑定显示出来,即退出编辑状态

ItemTemplate中的代码:
加入一个<td>,并在其中添加一个CommandName="Edit"的按钮。
<asp:Button ID="btnEdit" runat="server" Text="Edit" CommandName="Edit" />

EditItemTemplate中的代码:



《图27》
运行结果:



《图28》

(三)删除数据
删除操作不需要新模板,只需要在ItemTemplate模板(其它模板也可以)中添加一个“删除”按钮(CommandName="Delete")就可以。
当点击“删除”按钮后,ListView会执行以下操作:
1.ListView触发ItemDeleting事件。
2.ListView将主键值传递给DataSource控件对应的DeleteParameter。
3.ListView调用对应DataSource 控件的删除方法
4.ListView触发ItemDelete事件

在ItemTemplate中加入一个“删除”按钮
<asp:Button ID="btnEdit" runat="server" Text="Delete" CommandName="Delete" OnClientClick="return window.confirm('确认要删除吗? ')" />
并把ListView的DataKeyNames设置为表的主键字段
当点击“删除”按钮后就会删除数据了。



《图29》

(原创:灰灰虫的家http://hi.baidu.com/grayworm)

原创粉丝点击