ListView(2)

来源:互联网 发布:网络主管招聘 青岛沃林 编辑:程序博客网 时间:2024/06/05 02:26

7.4.6  ListView(2)

ListView组的显示

除了Item Container之外,ListView还支持另一个容器类型Group Container。Group Container与GroupTemplate一起使用,可以把较大的数据项组分成小组。每一组中的项数由控件的GroupItemCount属性设置。在显示一定数量的项模板后,要输出一些额外的HTML时,就可以使用GroupTemplate。使用GroupTemplate时,存在与上一节相同的问题。但在这里,不是把两个模板关联起来,引入GroupTemplate意味着要关联3个模板:ItemTemplate关联到GroupTemplate上,GroupTemplate关联到LayoutTemplate上。

ListView显示时,看起来似乎已经定义了GroupTemplate。如果控件找到了GroupTemplate,就确定LayoutTemplate上是否提供了Group Container。如果已经定义了GroupTemplate,控件就要求定义Group Container,否则就抛出异常。Group Container的工作方式与上一节描述的Item Container相同,但Group Container元素的id值应是groupContainer,而不是itemContainer。与Item Container一样,控件查找的特定id值可以通过改变控件的GroupContainerID属性来改变。

查看ListView的Tiled布局生成的标记时,可以看到Group Container的一个例子。这个布局的LayoutTemplate显示了一个用作Group Container的表,如下所示:

<table id="groupContainer" runat="server" border="0" style="">
</table> 

定义了Group Container后,还需要定义Item Container,但不是在LayoutTemplate中定义,而需要在GroupTemplate中定义。再次查看Tiled布局,会发现在其GroupTemplate中,定义了一个用作Item Container的表行。

 

<tr id="itemContainer" runat="server">
</tr>

 

显示时,ListView先输出其LayoutTemplate,再输出GroupTemplate。之后ItemTemplate输出GroupItemCount属性定义的次数。达到组的项数后,ListView就输出GroupTemplate,再输出ItemTemplate,为它绑定的每个数据项重复这个过程。

使用EmptyItemTemplate

使用GroupTemplate时,还要注意绑定到ListView控件上的数据项数可能不能被GroupItemCount值整除如果创建了一个ListView布局,它依赖HTML表排列其数据项,就一定要注意这个问题,因为最后一行定义的表单元格数可能少于前面的表行,使控件输出的HTML无效,并可能导致显示问题。要解决这个问题,ListView控件包含EmptyItemTemplate。如果使用GroupTemplate,且没有足够的数据项达到GroupItemCount值,就显示这个模板。图7-34显示了使用EmptyItemTemplate的一个例子。

 

 图  7-34

 

在这个例子中,绑定到ListView控件上的数据源包含4个数据项,但控件的GroupItemCount设置为3,表示在每个组中显示3个ItemTemplate。而在显示的第二个组中只有一个数据项,因此,该控件使用EmptyItemTemplate填充剩余的项。

在ListView的Tiled布局中可以看到使用EmptyItemTemplate的另一个例子。

2. ListView数据绑定和命令

因为ListView不在运行期间生成任何布局标记,也不像GridView那样包含任何自动生成字段的逻辑,所以每个模板都使用标准的ASP.NET内嵌数据绑定语法,来定位每个数据项在已定义布局中的值。

提示:

ASP.NET内嵌数据绑定语法详见本章后面的内容。

查看控件创建的默认Grid布局的ItemTemplate,就可以看到这些值。在这个模板中,绑定数据源的每一列都使用一个ASP.NET标签显示,该标签的文本属性设置为一个数据绑定计算表达式:

<asp:Label ID="ProductNameLabel" runat="server"
text='<%# Eval("ProductName") %>' />

因为该控件使用这个灵活的模型显示绑定的数据,所以可以利用这一点把数据放在模板的指定位置上,甚至可以使用ASP.NET的数据绑定功能处理绑定的数据,之后显示它们。

每个显示绑定数据的ListView模板都使用相同的ASP.NET绑定语法,只是为数据提供不同的模板。例如,如果可以在Grid布局中编辑,就会发现EditItemTemplate根据底层的数据类型,用文本框或复选框替代了ItemTemplate使用的ASP.NET标签。

<asp:TextBox ID="ProductNameTextBox" runat="server"
Text='<%# Bind("ProductName") %>' />

另外,这个灵活性还允许选择让终端用户如何编辑数据(假定使数据可以编辑)。这里不使用标准的ASP.NET文本框,也可以用下拉列表或第三方编辑控件来替代它。

要让ListView为数据项显示EditItemTemplate,该控件需要使用与GridView控件相同的命令概念。ItemTemplate提供了3个命令,可用于改变数据项的状态。

表  7-9

   

   

Edit

使指定的数据项进入编辑模式,为数据项显示EditTemplate

Delete

从底层数据源中删除指定的数据项

Select

ListView控件的Selected索引设置为指定数据项的索引

这些命令与ASP.NET按钮控件的CommandName属性一起使用。使用ListView配置对话框激活Editing和Deleting,就可以看到在ListView的默认Grid布局的ItemTemplate中使用的这些命令。这么做会生成一个包含Edit和Delete按钮的新列,这两个按钮把CommandName属性分别设置为Edit和Delete。

<asp:Button ID="DeleteButton" runat="server"
CommandName="Delete" Text="Delete" />
<asp:Button ID="EditButton" runat="server"
CommandName="Edit" Text="Edit" />

ListView的其他模板提供了其他命令,如表7-10所示。

表  7-10

   

   

   

EditItemTemplate

Update

更新ListView数据源中的数据,并把数据项返回给ItemTemplate进行显示

EditItemTemplate

Cancel

取消编辑,并把数据项返回给ItemTemplate

InsertItemTemplate

Insert

把数据插入ListView数据源

InsertItemTemplate

Cancel

取消插入,重置InsertTemplate控件绑定值

原创粉丝点击