zoukankan      html  css  js  c++  java
  • ASP.NET中的“事件冒泡”

    理解事件冒泡?

    一、理解事件冒泡

     

    ASP.NET框架包含三个支持事件冒泡的标准控件:RepeaterDataListGridView控件。这些控件可以让你捕获其子控件的时间。

     

    当子控件产生一个事件时,事件就“冒泡”传给包含该子控件的容器控件,并且容器控件就可以执行一个子程序来处理该事件。

    二、使用模板

    Repeater控件有五个模板(ItemTemplateAlternationgItemTemplateSeparatorTemplate

    HeaderTemplateFooterTemplate),可以格式化控件的输出。在DataList控件中除了支持Repeater控件中的五个模板以外,还支持如下两个模板:

     

    1SelectedItemTemplate:控制如何格式化被选定的项

     

    2EditItemTemplate:控制如何格式化被编辑的项。

     

    当选定DataList中选中一个项时(即DataListSelectedIndex属性值为当前选定项的索引值),将显示SelectedItem模板,当在DataList中选择一个项来编辑(即DataListEditItemIndex属性值为当前选定项的索引值)时,将显示EditItem模板。

     

    三、在DataList中显示数据:

     

    可以像Repeater控件那样来用DataList显示数据库表中的记录。但是,与Repeater控件不同的是:DataList控件的默认行为是在HTML表格中显示数据库记录。

     

    四、在DataList中创建多列

     

    DataList的一个好处的特征是可以以多个列显示数据。通过设置其RepeatColumnsRepeatDirection属性,可以控制DataList的列的布局。

     

    RepeatColumns属性决定要显示的列的数量。比如,如果要在DataList中显示四列的项,那么可以把这个属性设为4

     

    RepeatDirection属性句顶列是按水平或垂直方向来重复。在默认情况下,RepeatDirection值为Vertical,因此,如果

     

    RepeatColumns值为4,则列就像这样显示:

     

    Column 1 Column3 Column5 Column7

     

    Column 2 Column4 Column6 Column8

     

    如果把RepeatDirection设为Horizontal,而且RepeatColumns值为4,那么列就像这样显示:

     

    Column 1 Column3 Column5 Column7

     

    Column 2 Column4 Column6 Column8

     

    注意,即使RepeatDirection值为Vertical,还是显示为4个列。RepeatColumns永远是指重复的列的数量,而不是行的数量。

    五、捕获DataList控件中产生的事件

     

    DataList控件支持事件冒泡,可以捕获DataList内包含的控件产生的事件,并且通过普通的子程序处理这些事件。讲到这里有些人可能不太明白事件冒泡的好处所在,这样,我们反过来思考:如果没有事件冒泡,那么对于DataList内包含的每一个控件产生的事件都需要定义一个相应的处理函数,如果DataList中包含10000个控件呢?或者更多呢?那我们得写多少个事件处理程序。所以有了事件冒泡,不管DataList中包含多少个控件,我们只需要一个处理程序就可以了。DataList控件支持五个事件:

     

    1) EditCommand:由带有CommandName=edit”的子控件产生

     

    2) CancelCommand由带有CommandName=cancel”的子控件产生

     

    3) UpdateCommand由带有CommandName=update”的子控件产生

     

    4) DeleteCommand由带有CommandName=delete”的子控件产生

     

    5) ItemCommandDataList的默认事件

     

    有了这五个事件,那么当我点击了DataList控件中的某一个按钮的时候,应该触发哪一个事件呢?什么时候才触发它们呢?在ASP.NET中有三个控件带有CommandName属性,分别是ButtonLinkButtonImageButton,可以设置它们的CommandName属性来表示容器控件内产生的事件类型。比如,如果设置DataList中的一个LinkButtonCommandName属性为update”,那么点击此按钮的时候,将会触发DataListUpdateCommand事件,我们可以将相关处理代码写到对应的事件处理程序中去。

    大家注意到与DataList关联的函数都带有一个DataListCommandEventArgs的参数。该阐述表示从DataList传递给该函数的信息。

     

    DataListCommandEventArgs具有如下属性:

     

    Ø CommandArgument:表示来自于产生该事件的控件的CommandArgument属性值。

     

    Ø CommandName:表示产生该事件的命令名称。

     

    Ø CommandSource:表示产生该事件的DataList控件。

     

    Ø Item:表示来自DataList的项。就是DataList中发生事件的那一项。该属性非常有用,在后面的章节中会经常使用到!

     

     

    六、选择DataList中的项

     

    在第一小节中我们讲到DataList控件比Repeater控件多两个模板,SelectedItemTemplate模板可以格式化DataList中被选定的项的格式。

     

    数据绑定到DataList后,DataList中的每一项都有一个索引号第一项的索引为0,依次往下编号。我们可以利用索引来确定DataList中具体的项。

     

    DataList默认以ItemTemplateItemTemplate+AlternatingItemTemplate模板显示数据项,当DataListSelectedIndex属性(该属性默认值为-1,表示不显示SelectedItemTemplate模板)的值为DataList某一项的索引的时候,对应的项将会以SelectedItemTemplate模板显示。

    注意一下几点:

    Ø ItemCommand事件DataList控件产生的默认事件,任何DataList控件中CommandNamedelete/cancel/update/edit的按钮被点击后,首先触发的是ItemCommand事件,然后才是相应的事件。

     

    Ø 但是当DataList控件中存在一个普通按钮,点击后触发ItemCommand事件,假设执行功能为选择当前项,此时如果点击了CommandNameedit的按钮,将当前项显示为编辑状态。这个时候并没有出现当前行既被选中又被编辑的情形,这和以上的结论(先触发ItemCommand事件)好象相违背。事实上这并不矛盾,因为DataList控件中的项同一时刻只能显示一个EditItemTemplateSelectedItemTemplate模板,所以执行过程应该是这样的。点击了CommandNameedit的按钮后首先触发了ItemCommand事件,将当前的项显示为SelectedItemTemplate模板,然后再触发EditCommand事件,将当前的项显示为EditItemTemplate模板,覆盖了前面已经显示的SelectedItemTemplate模板,只不过因为速度太快,肉眼看不出这个过程而已!

     

    七、使用DataList控件中的DataKeys集合

     

    在选择DataList中的一个项时,通常需要获取与这个项相关联的主键的值。可以使用DataKeys集合来获取与一个项想关联的主键的值。

    注意:只有当所使用的数据表具有单个主键列时,才可以使用DataKeys集合。也就是说不能使用联合主键。

     

    在创建了DataKeys集合后,就可以通过传递项的索引值给DataKeys集合来获取DataList中与相关项关联的主键值。比如,要获取由DataList显示的第三项的主键值,就可以是使用语句:DataList1.DataKeys[2] // DataList1DataList控件的ID

     

    如果要在DataList控件的事件处理函数中发生事件的项的主键值,则可以使用语句:DataList1.DataKeys[e.Item.ItemIndex] //

     

    DataList1DataList控件的ID .

     

    八、编辑DataList中的项 ★★★★★

    可以使用DataList控件来编辑数据表中的某一条记录,如下图,事实上,在DataList中完成这样的操作非常的方便,不像在asp中需要在多个页面中来回切换。

     

    DataList控件具有一个名为EditItemTemplate的模板,可以在EditItemTemplate中放置表单控件,以便能在DataList中编辑特定的项。当DataListEditItemIndex属性(该属性默认值为-1,表示不显示EditItemTemplate模板)的值为DataList某一项的索引的时候,对应的项将会以EditItemTemplate模板显示。

     

    注意:在DataList中一次只能有一个项被选定来编辑。

     

    点击其中某一项中的edit按钮的时候,将触发DataList控件的EditCommand事件,通过执行语句DataList1.EditItemIndex = e.Item.ItemIndex;将当前项显示为EditItemTemplate模板,在EditItemTemplate模板中点击cancel按钮的时候,将触发DataList控件的CancelCommand事件,通过执行语句DataList1.EditItemIndex = -1; 将当前项恢复显示为ItemTemplate模板;

    当点击update按钮的时候,将触发DataList控件的UpdateCommand事件,在UpdateCommand事件的处理程序中,我们需要取得当前项

     

    对应的主键值及修改之后的值才能够完成更新,通过执行语句DataList1.DataKeys[(int)e.Item.ItemIndex].ToString();来获取当前主键值(前提是指定了DataList1DataKeyField属性值为主键字段),由于DataKeys集合返回数据类型为object类型,我们还需要调用其ToString()方法来转换成字符串类型。通过执行语句(TextBox)e.Item.FindControl( "txtLastName" )来获得更新后的au_lname的值,FindControl(”控件ID”)方法通过检索当前项中包含的特定ID的控件,其返回值类型为Control类型,所以还需要强制将其转换为TextBox类型,如果没有找到该ID的控件,则返回0,最后通过取得的主键值和更新后的字段的值更新数据库表。

     

    最后不要忘了重新绑定一下,否则数据库里最新的数据将不会显示出来。

     

     

  • 相关阅读:
    算法导论第十八章 B树
    腾讯2016春招之算法编程解析
    LeetCode:5_Longest Palindromic Substring | 最长的回文子串 | Medium
    搜狗2016校园招聘之算法编程解析
    linux sed在某些字符串的下一行插入内容?sed在下一行插入?
    linux shell搜索某个字符串,然后在后面加上字符串?字符串后面插入字符串?sed字符串后面插入字符串?
    linux环境中,如何使用tar来创建压缩包?解压缩?
    linux环境中,ssh登录报错,Permission denied, please try again.
    linux环境中安装NRPE插件执行远程"本地资源"检查?NRPE安装?
    linux环境安装nagiosgraph将nagios的性能数据绘制成动态图表?
  • 原文地址:https://www.cnblogs.com/majunfeng/p/3933866.html
Copyright © 2011-2022 走看看