点击按钮时让一些事情发生
现在已将按钮添加到datagrid中了,我们希望将服务器端的代码与按钮关联起来,这样当按钮被点击时可发生一些动作。在认识到datagrid中的buttoncolumn按钮被点击时itemcommand事件将被触发后,那么我们就可为这个事件编写服务器端的事件处理程序。这个事件处理程序必须定义如下:
sub eventhandlername(sender as object, e as datagridcommandeventargs)
…
end sub
一旦在服务器端代码块(或代码后置页)中定义了此过程,你可通过在datagrid的标记中增加onitemcomman属性的方法将datagrid的事件与该事件处理程序联系起来,如下所示:
<asp:datagrid runat="server"
…
onitemcommand="eventhandlername">
…
</asp:datagrid>
下面的代码演示了当datagrid中某个按钮被按下时,事件处理程序如何运行:
<script language="vb" runat="server">
sub page_load(sender as object, e as eventargs)
if not page.ispostback then
binddata() only bind the data on the first page load
end if
end sub
sub binddata()
make a connection to the database
databind the datareader results to the datagrid.
end sub
sub detailsclicked(sender as object, e as datagridcommandeventargs)
response.write("you clicked one of the details buttons!")
end sub
</script>
<form runat="server">
<asp:datagrid runat="server" … >
…
</asp:datagrid>
</form>
示例运行结果如下:
包含事件处理程序的datagrid
本示例显示一个包含detail按钮的datagrid web控件并演示了当按下按钮时如何触发一段代码。点击某个detail按钮,你将会在status文本旁看到一个消息,他指出了你点击了这个按钮!
status: you clicked one of the details buttons!
faq details
faq id
faq description
144
where can i host my asp web site for free (similar to geocities or tripod or any of the many other free web site sites)?
181
how can i format numbers and date/times using asp.net? for example, i want to format a number as a currency.
…
源代码:
<% @import namespace="system.data" %>
<% @import namespace="system.data.sqlclient" %>
<script language="vb" runat="server">
sub page_load(sender as object, e as eventargs)
if not page.ispostback then
binddata()
end if
end sub
sub binddata()
1. create a connection
dim myconnection as new sqlconnection(configurationsettings.appsettings("connectionstring"))
2. create the command object, passing in the sql string
const strsql as string = "sp_popularity"
dim mycommand as new sqlcommand(strsql, myconnection)
set the datagrids datasource to the datareader and databind
myconnection.open()
dgpopularfaqs.datasource = mycommand.executereader(commandbehavior.closeconnection)
dgpopularfaqs.databind()
end sub
sub dispdetails(sender as object, e as datagridcommandeventargs)
lbloutput.text = "you clicked one of the details buttons!"
end sub
</script>
<form runat="server">
<b>status:</b> <asp:label id="lbloutput" runat="server" font-italic="true" />
<p>
<asp:datagrid runat="server" id="dgpopularfaqs"
backcolor="#eeeeee" width="85%"
horizontalalign="center"
font-name="verdana" cellpadding="4"
font-size="10pt" autogeneratecolumns="false"
onitemcommand="dispdetails">
<headerstyle backcolor="black" forecolor="white" font-bold="true" horizontalalign="center" />
<alternatingitemstyle backcolor="white" />
<columns>
<asp:buttoncolumn text="details" headertext="faq details" commandname="details" buttontype="pushbutton" />
<asp:boundcolumn datafield="faqid" headertext="faq id" />
<asp:boundcolumn datafield="description" headertext="faq description" />
</columns>
</asp:datagrid>
</form>
这里还有一件非常重要的事情需要注意:我们仅在第一次页面访问时执行数据库查询并对datagrid进行绑定。在page_load事件处理程序(每次页面装载时被触发)中,我们检查页面是否被回发(posted back)。如果没有,那么就知道是第一次访问这个页面。在此情况下我们通过数据库查询生成一个datareader,将datagrid的datasource属性设为这个datareader,并调用datagrid的databind()方法。
当有人点击datagrid中某个detail按钮时,asp.net web页面将执行回发,页面又将在服务器端执行。page_load事件处理程序将再次被激活,但是这次因为我们在执行回发,binddata()过程将不会被调用。此外detailsclicked事件处理程序将被执行。注意如果我们每次在页面装载时均将数据绑定至datagrid(也就是说我们省略了if not page.ispostback检查),detailsclicked事件处理程序将不会执行,因为重新绑定datagrid将会清空(flush out)itemcommand事件。(请重新阅读上面的两段文字-根据各位对datagrid的了解,你们很有可能忘记执行回发检查并导致datagrid不能触发针对按钮的事件处理代码。相信我,这件事在我身上多次发生!j)
虽然本例分析了如何将事件处理与按钮的点击联系起来,我们仍然需要知道如何判断datagrid那一行中的按钮被点击。这是一个非常重要的问题,并将在本文下一部分进行研究。