DataList和Repeater里的自定义button
学习内容:为ItemCommand event创建一个event handler将服务器端代码和点击button关联起来。
DataList和Repeater可以在templates里包含很多Buttons, LinkButtons, ImageButtons。这些button被点时会引起postback,并激发ItemCommand事件。为ItemCommand event创建一个event handler可以将服务器端代码和点击button关联起来。在这个event handler里首先检查传入的CommandName的值来判断是哪个button被点了。其它另外的信息可以通过CommandArgument属性来提供。 //类CommandEventArgs有两个公共属性,CommandName(用来获取命令的名称)和CommandArgument(用来获取命令的参数)。
任何时候,当DataList或Repeater的template里的Button, LinkButton, ImageButton被点时,会产生postback,并激发DataList或Repeater的ItemCommand事件。除了ItemCommand外,如果button的CommandName 设为(“Delete”, “Edit”, “Cancel”, “Update”, “Select”)其中一个时,DataList会激发另外一个事件。但ItemCommand都是会被激发的。
当DataList或Repeater的template里的Button被点时,通常需要获取哪个button被点了(一个控件里可能有多个button,比如编辑和删除),还可能需要一些其它的信息(比如那些button被点的item(项)的主键)。Button, LinkButton, ImageButton提供了两个属性,它们的值可以传给ItemCommand event handler:
1. CommandName –表示template里每个button身份的字符串。
2. CommandArgument – 通常用来保存一些值,比如主键。
配置ObjectDataSource
添加一个DataList或Repeater,再添加一个CategoriesDataSource的ObjectDataSource做数据源,用CategoriesBLL类的GetCategories()方法配置它。Visual Studio会根据数据源为DataList创建一个默认的ItemTemplate,而Repeater的templates需要手工定义。
当点“Show Products” LinkButton 时执行服务器端代码
将LinkButton的CommandName设为“ShowProducts”,并将当前记录的主键– CategoryID –通过绑定语法绑定到CommandArgument。(CategoryArgument='<%# Eval("CategoryID") %>'//在每一项中将CategoryID单向赋给CategoryArgument)
当button被点时,产生postback并激发DataList或Repeater的ItemCommand事件。Button的CommandName和CommandArgument值被传到event handler里。
为ItemCommand事件创建一个event handler,注意event handler的第二个参数(名字为e)。这个参数的类型为RepeaterCommandEventArgs,它有以下4个属性:
1. CommandArgument – 被点的 button’的CommandArgument property 的值
2. CommandName – button’的CommandName property 的值
3. CommandSource – 被点 button 的引用
4. Item – 包含被点button 的 RepeaterItem的引用; 每条绑定到Repeater的记录被表明为一个 RepeaterItem
由于选择的category的CategoryID通过CommandArgument传入,可以在ItemCommand event handler里获取与之相关的products。这些products在ItemTemplate(添加过了的)里绑定到一个BulletedList。剩下的事就是添加BulletedList,在ItemCommand event handler里引用它,然后将选择的category的products绑定到BulletedList(详细介绍见下面MSDN中内容)
注意:DataList的ItemCommand event handler传入了一个DataListCommandEventArgs类型的对象,它提供和RepeaterCommandEventArgs 一样的4个属性。
显示选择的Category的 Products
使用BulletedList。回到CustomButtons.aspx page页的声明代码,在“Show Products” LinkButton后添加一个BulletedList。ItemCommand event handler里通过e.Item.FindControl("ProductsInCategory")引用这个控件,并与products绑定。
C#
protected void Categories_ItemCommand(object source, RepeaterCommandEventArgs e)
{
if (e.CommandName == "ShowProducts")
{
// Determine the CategoryID
int categoryID = Convert.ToInt32(e.CommandArgument);
// Get the associated products from the ProudctsBLL and bind
// them to the BulletedList
BulletedList products =(BulletedList)e.Item.FindControl("ProductsInCategory");
ProductsBLL productsAPI = new ProductsBLL();
products.DataSource =productsAPI.GetProductsByCategoryID(categoryID);
products.DataBind());
}
}
在ItemCommand event handler里执行任何操作前,需要先检查传入的CommandName。由于ItemCommand event handler在任何button被点时都会执行,如果在template里有多个button时需要通过CommandName的值来辨别需要采取什么操作。在前面 DataList里使用button 的教程里,通过DataKeys集合来获取给定item的主键。这个方法在DataList里很好用,但是Repeater没有DataKeys属性。因此需要换一种方法来提供主键的值,比如通过button的 CommandArgument,或者在template使用一个隐藏的Label,然后通过e.Item.FindControl("LabelID")在ItemCommand event handler里读出它的值。
注意:如果需要修改这个报表的行为,比如一次只列出一个category的products,仅仅只需要将BulletedList的EnableViewState属性设为False。
来自MSDN中的内容:
BulletedList类:创建一个控件,该控件生成一个采用项目符号格式的项列表。 命名空间:System.Web.UI.WebControls
备注
使用 BulletedList 控件来创建一个采用项目符号格式的项列表。若要指定希望显示在 BulletedList 控件中的个别列表项,请在 BulletedList 控件的开始标记和结束标记之间为每个项放置一个 ListItem 对象。
若要指定 BulletedList 控件中用于显示列表项的项目符号类型,请将 BulletStyle 属性设置为 BulletStyle 枚举定义的项目符号类型之一。下表列出了可用的项目符号样式。
项目符号样式
说明
NotSet 未设置。
Numbered 数字。
LowerAlpha 小写字母。
UpperAlpha 大写字母。
LowerRoman 小写罗马数字。
UpperRoman 大写罗马数字。
Disc 实心圆。
Circle 圆圈。
Square 实心正方形。
CustomImage 自定义图像。
图:BulletedList样式
使用 FirstBulletNumber 属性来指定排序 BulletedList 控件中开始列表项编号的值。如果 BulletStyle 属性设置为 Disc、Square、Circle 或 CustomImage 字段,则忽略分配给 FirstBulletNumber 属性的值。如果将 BulletStyle 属性设置为 CustomImage 的值,以指定项目符号的自定义图像,则您还必须设置 BulletImageUrl 属性以指定图像文件的位置。
若要指定 BulletedList 中列表项的显示行为,请将 DisplayMode 属性设置为 BulletedListDisplayMode 枚举定义的值之一。定义的显示行为是 Text、HyperLink 和 LinkButton。
单击超链接时,将定位到相应的 URL。使用 Value 属性指定超链接定位到的 URL。使用 Target 属性指定框架或窗口,单击超链接时,将在该框架或窗口显示定位到的网页。
当 DisplayMode 属性设置为 LinkButton 时,BulletedList 控件将列表项显示为链接,单击这些链接将回发到服务器。若要以编程方式控制单击链接按钮时执行的操作,请为 Click 事件提供事件处理程序。请注意,SelectedIndex 和 SelectedItem 属性是从 ListControl 类继承而来的,并且不适用于 BulletedList 控件。使用 BulletedListEventArgs 类的事件数据来确定单击的 BulletedList 中的链接按钮的索引。
BulletedList 控件也支持数据绑定。若要将 BulletedList 绑定到数据源,可以使用提供的任意数据绑定机制。
Button.CommandArgument 属性获取或设置可选参数,该参数与关联的 CommandName一起被传递到 Command 事件。命名空间:System.Web.UI.WebControls
备注
使用 CommandArgument 属性来指定补充 CommandName 属性的参数。
注意
尽管可以单独设置 CommandArgument 属性,但该属性通常只在也设置了 CommandName 属性时才使用。
CommandArgument 属性通过使您可以提供有关要执行的命令的附加信息,对 CommandName 属性加以补充。例如,如果将 CommandName 属性设置为 Sort,并将 CommandArgument 属性设置为 Ascending,则指定了按升序进行排序的命令。类CommandEventArgs有两个公共属性,CommandName(用来获取命令的名称)和CommandArgument(用来获取命令的参数)。具体见:http://hi.baidu.com/fuhengyu/blog/item/9a5c2b10dec22305213f2ed2.html