




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第七章数据的显示与处理本章学习目标:本章主要讲解如何把数据库中的数据通过数据的列表控件显示出来并达到用户的要求,以及通过列表控件对数据库中的数据进行操作。通过对本章的学习,读者应该掌握以下主要内容:DataGrid控件的使用方法
数据显示与处理的实际应用。例如,“伪邮件系统”中邮件的显示和附件标志的处理方式7.1伪邮件系统中邮件发送与接收说明第七章数据的显示与处理7.2邮件的发送7.2.1伪邮件发送界面说明7.2.2伪邮件发送程序7.3对于一个指定邮件的显示7.3.1DataGrid控件的介绍7.3.2DataGrid控件实现数据库记录的分页显示7.3.3DataGrid控件的记录排序7.3.4DataGrid控件定制列元素7.4.1伪邮件的接收-收件箱程序7.4.2显示指定邮件的方法7.1伪邮件邮件的发送与接受说明在本伪邮件系统中,在邮件的发送之前,必须首先要进行登录,登录成功之后才能进行邮件发送与接收。伪邮件系统中邮件的发送其实就是向“邮件数据表”中添加一条记录。工作过程是:用户在一个Web页面上填写收件人的用户名、主题、邮件正文以及所带的附件,然后点击“邮件发送”按钮,这时该页面的程序代码会执行一个操作把用户所填写的内容以及发件人的名字,当前写入数据表的时间(作为邮件的发送时间),写入“邮件数据表”中,即向该邮件数据表中添加一条记录。7.1伪邮件邮件的发送与接受说明这里所说的邮件接收,其实就是一种把“邮件数据表”中收件人与用户在使用本伪邮件系统的登录名相同的所有记录显示出来,然后用户可根据邮件的状态来选择删除某一记录(邮件)或显示某一邮件的详细信息。强调的是为了能使用户感觉比较正规,一般接收者在打开邮箱以前,就能看到是否有新邮件到来,所以在邮件数据表中设立了一个“邮件标志”标志字段,当邮件标志的值为1时,表示该邮件是新邮件,即当用户向邮件数据表中添加一条记录时该标志字段被置为1;当邮件标志的值为0时,表示该邮件是用户已阅读过的邮件,即只要用户打开过一次一条新邮件记录,立即把这条记录的“邮件状态标志”设为0;当邮件状态标志的值为2时,表示此邮件在用户的垃圾箱中,即当用户把某一邮件记录扔到垃圾箱时,仅是把这条记录的“邮件状态标志”设为2。这样有利于程序员在编制程序时,能根据不同的情况列出不同的记录。例如:A用户要查询所有未读邮件,程序可以在邮件数据表中用这样的SQL查询语句:SELECT*FROMEMAILWHERED_EMAIL=’A’ANDEMAIL_FLAG=17.1伪邮件邮件的发送与接受说明这个SQL查询语句用语言来解释就是“在‘邮件数据表email中筛选邮件的目的地址=‘A’并且邮件标志=0的所有记录”。如果A用户要显示其收件箱的内容,应该显示“邮件数据表”中邮件的目的地址是登录名A,并且邮件标志小于2的所有记录(即除了垃圾箱内的邮件),其SQL查询语句:SELECT*FROMEMAILWHERED_EMAIL=’A’ANDEMAIL_FLAG<2
7.2.1伪邮件发送界面说明Web邮件的发送界面一般来说都是通过一个HTML的框架结构来实现的。通常来说是把一个框架分成两个左右两个部分,左边部分是用户进行邮件操作所使用的菜单,如发邮件、收件夹、未读邮件、垃圾箱等等一些导航按钮,当用户单击这些导航按钮之后,右边的部分就显示相应的页面。下面来看一下写邮件的界面,如图7-1所示,该页面是用户“liubing”登录后进行写邮件的界面。7.2.1伪邮件发送界面说明在这个邮件的发送界面中有三个Web程序:框架结构程序,程序名:w7-1.aspx
左边的菜单选择程序,程序名:left.aspx右边的发送邮件程序,程序名:sendmail.aspx首先,介绍一下框架结构程序w7-1.aspx。下面是该程序的源代码:代码清单w7-1.aspx<%@Pagelanguage="VB"%><%ifsession("username")=""then Response.Redirect("login.aspx")endif%><html>7.2.1伪邮件发送界面说明 <head> <title>main_email</title> </head> <framesetcols="150,*"> <framename="contents"src="left.aspx"> <framename="main"src="sendmail.aspx"> <noframes> <p>本页需要框架结构,但是您的浏览器不支持它</p> </noframes> </frameset></html>7.2.1伪邮件发送界面说明在此程序中,首先判断使用该程序的用户是否登录,如果会话变量“username”为空,则说明当前使用该程序的用户没有登录,那么程序会重新导航到登录界面程序“login.aspx”,要求用户登录;第二,此程序把整个浏览器窗口分成左右两部分。左边框架调用程序“left.aspx”,并把该部分用对象名“contents”定义。右边框架调用程序“sendmail.aspx”,并把该部分用对象名“main”定义。这两个对象名,在本窗口的其它程序中可使用它们指定在哪一个框架打开相应的Web应用程序,这在left.aspx中会体现。下面来对left.aspx程序进行说明。其程序的源代码如下:代码清单left.aspx<%@Pagelanguage="VB"%><html> <head> <title></title> </head> <bodybgcolor="#ffff00"> 这是<%=session("username")%>邮箱<br> <br>7.2.1伪邮件发送界面说明 <ahref="noread.aspx"target=main>未读邮件</a><br> <br> <ahref="w7-401.aspx"target=main>收件箱</a><br> <br> <ahref="sendmail.aspx"target=main>发邮件</a><br> <br> <ahref="w7-403.aspx"target=main>垃圾箱</a><br> <br> </body></html>7.2.1伪邮件发送界面说明该程序在客户端浏览器中的显示结果如图7-1左边框架所示。该程序中定义了几个超级链接导航按钮,每个导航按钮都打开不同的Web应用程序,但是并不是新打开一个浏览器窗口打开来显示相应的Web应用程序,而是在图7-1的右边框架中显示。这是因为在该程序的每个导航按钮的定义中都使用了如下的属性设置:target=main这里“target”属性被设置为一个对象名“main”,这个对象名正是在w7-1.aspx应用程序中,用于定义浏览器窗口右边的框架对象名。如果把“target”值设为在w7-1.aspx定义的左边框架的对象名“contents”,则打开的应用程序就会在左边的框架中显示7.2.2伪邮件的发送程序邮件的发送是把用户在图7-1中所填写的用户数据(包括收件人、主题、邮件内容、附件)和一些隐含的信息(包括发件人、发送时间、新邮件标志及附件标志)写入到数据库(本例中数据库在SQLServer中的名字是DBEmail)的数据表中(本例中的数据表是邮件数据表,名字是email),相当于在数据表中添加一条记录。当记录添加完毕之后,浏览器窗口被重新导航,打开一个邮件发送成功的页面。这个导航语句如下所示:Response.Redirect("sendmail_success.aspx?receive="&receive.text)在该语句中,Response.Redirect表示导航的含义,即打开一个新的Web页,这个Web页的名字是sendmail_success.aspx,同时还带有一个参数receive,这个参数的内容是receive.text的值,而receive是图7-1中收件人文本框的对象名,也就是说这个参数的值是收件人的邮件地址。这样在这个发送成功Web页中,会有一个提示页面,说明该邮件已经发送到某某用户的邮箱。7.2.2伪邮件的发送程序代码清单sendmail.aspx<%@Pagelanguage="VB"%><%@ImportNamespace="System.Data"%><%@ImportNamespace="System.Data.SqlClient"%><html> <head> <title></title>7.2.2伪邮件的发送程序 <scriptlanguage="vb"runat="server">Subsendmail(ByValsenderAsSystem.Object,ByValeAsSystem.EventArgs)'连接数据库,并添加一条记录DimconAsNewSqlConnection("DataSource=.;"&_ "InitialCatalog=DBEmail;UID=sa;PWD=")DimcmdAsSqlCommandDimqryAsStringcon.Open()7.2.2伪邮件的发送程序qry=“INSERTINTOemail(s_email,d_email,subject,content,email_flag,sendtime,att_flag)"&_ "Values('"&session("username")&_ "','"&receive.Text&_"','"&subject.Text&_"','"&content.Text&_"','"&"1"&_"','"&Now()&_"','"&"0"&"')"cmd=NewSqlClient.SqlCommand(qry,con)cmd.ExecuteNonQuery()con.Close()
'邮件发送成功,导航到发送成功Web程序:sendmail_success.aspxResponse.Redirect("sendmail_success.aspx?receive="&receive.text)EndSub7.2.2伪邮件的发送程序Subclear_all(ByValsenderAsSystem.Object,ByValeAsSystem.EventArgs)receive.Text=""subject.Text=""content.Text=""endsub</script></head><body><formid="Form1"method="post"runat="server"><center>写邮件</center><br><br><tablecellspacing=1cellpadding=1width=400border=0>7.2.2伪邮件的发送程序<tr><td>收件人(To):</td><td><asp:textboxid="receive"runat="server"/></td></tr><tr><td>主 题(Subject):</td><td><asp:textboxid="subject"runat="server"/></td></tr><tr><td>附 件:</td>7.2.2伪邮件的发送程序<td><inputtype="file"id="attach"runat="server"></td></tr></table>邮件正文(EmailBody):<br><asp:TextBoxid="content"runat="server"Height="200px"Width="400px"TextMode="MultiLine"></asp:TextBox><br><p> <asp:Buttonid="Button_sendmail"runat="server"Text="发送"onclick="sendmail"></asp:Button><asp:Buttonid="Button_Reset"runat="server"Text="重新填写"onclick="clear_all"></asp:Button></p></form></body></html>7.2.2伪邮件的发送程序图7-2用户填写邮件内容7.2.2伪邮件的发送程序例如用户填写好相应的邮件内容(如图7-2所示),并且邮件发送成功之后,页面被导航到邮件发送成功页面(程序名:sendmail_success.aspx),在客户浏览器运行显示的结果如图7-3所示。其程序源代码如下所示:代码清单sendmail_success.aspx<html><head><title>邮件发送成功</title></head><bodybgcolor=#fffffftopmargin=5marginheight=0leftmargin=5marginwidth=0><br><tablewidth=610border=0cellspacing=5cellpadding=0>7.2.2伪邮件的发送程序<trbgcolor=#336699> <tdheight=25align=centercolspan=4><fontcolor=#ffcc00><b>邮件发送成功!</b></font></td></tr><trvalign=top> <tdwidth=90rowspan=3></td> <tdalign=rightwidth=150class=f14>邮件发送给:</td>7.2.2伪邮件的发送程序<tdclass=f16><%Response.write(Request.QueryString("receive"))%></td> <tdwidth=90rowspan=3></td></tr><trvalign=top> <tdalign=rightclass=f14>抄送给:</td> <tdclass=f16>无</td></tr><trvalign=top><tdalign=rightclass=f14>密送给:</td> <tdclass=f16>无</td>7.2.2伪邮件的发送程序</tr><tralign=rightbgcolor=#336699><trvalign=top><trbgcolor=#336699> <tdheight=25align=centercolspan=4><fontcolor=#ffcc00><b>邮件发送成功!</b></font></td></tr></table></body></html>7.2.2伪邮件的发送程序图7.3邮件发送成功界面7.2.2伪邮件的发送程序在邮件数据表(email)中的存储情况如图7-4所示。图7-4邮件发送成功后邮件数据表中的存储情况7.3.1DataGrid控件简介DataGridWeb服务器控件以表格式布局显示数据。默认情况下,DataGrid以只读模式显示数据,但是DataGrid也能够在运行时可修改或删除数据库中的数据。另外,DataGrid还支持分页。DataGridWeb服务器控件必须通过其DataSource属性绑定到数据源,否则它将无法在页面上显示数据。DataGrid的典型数据源为DataSet和OleDbDataReader。当数据绑定时,可以为DataGrid控件整体指定一个数据源。网格为数据源中的每一行显示一行,即一项。默认情况下,DataGrid控件为数据源中的每个字段生成一个绑定列。也可以选取数据源中的部分字段生成网格中的列。当Web程序运行时,程序内部的代码必须调用控件的DataBind方法以加载带有数据的网格。如果数据更改(例如,在一个事件处理程序中),则需要再次调用该方法以刷新网格。作为数据绑定的一部分,可以指定DataKeyField属性。此属性允许指定唯一标识网格中的每项信息。该信息不必是网格中显示的信息的一部分。它可以由数据源中的字段名组成(如主键)。和其他服务器控件一样,DataGrid控件中的数据绑定是单向的,也就是说,数据绑定是只读的。如果要使用网格允许用户编辑数据,则必须创建自己的代码来更新该数据源。在更新数据源之后,再次将数据绑定到该数据源。更新逻辑经常利用DataKeyField定位使用该键值的正确记录。其使用语法为:7.3.1DataGrid控件简介<ASP:DataGridId="被程序代码所控制的名称"Runat="Server"DataSource='<%#数据系结叙述%>'AllowPaging="True|False"AllowSorting="True|False"AutoGenerateColumns="True|False"BackImageUrl="url"CellPadding="像素"CellSpacing="像素"DataKeyField="主键字段"7.3.1DataGrid控件简介GridLines="None|Horizontal|Vertical|Both"HorizontalAlign="Center|Justify|Left|NotSet|Right"PagedDataSourcePageSize="ItemCount"ShowFooter="True|False"ShowHeader="True|False"VirtualItemCount="ItemCount"AlternatingItemStyle-Property="value"EditItemStyle-Property="value"FooterStyle-Property="value"HeaderStyle-Property="value"7.3.1DataGrid控件简介ItemStyle-Property="value"PagerStyle-Property="value"SelectedItemStyle-Property="value"OnCancelCommand="事件程序"OnDeleteCommand="事件程序"OnEditCommand="事件程序"OnItemCommand="事件程序"OnItemCreated="事件程序"OnPageIndexChanged="事件程序"OnSortCommand="事件程序"OnUpdateCommand="事件程序"/>或<ASP:DataGridId="被程序代码所控制的名称"Runat="Server"AutoGenerateColumns="False"DataSource='<%#DataBindingExpression%>'其它属性设定...<PropertyName="Columns">7.3.1DataGrid控件简介<ASP:BoundColumn/><ASP:EditCommandColumn/><ASP:HyperlinkColumn/><ASP:TemplateColumn>样版设定...</ASP:TemplateColumn></Property></ASP:DataGrid>DataGrid控件常用的属性如表7-301所示。DataGrid控件所能控制的事件如表7-302所示。表7-301DataGrid控件常用的属性7.3.1DataGrid控件简介属性说明AllowCustomPaging设置指示是否启用自定义分页的值。AllowPaging设定是否允许分页。AllowSorting设定是否允许排序数据AutoGenerateColumns设定是否要自动产生数据源中每个字段的数据,默认值为True。BackImageUrl设定表格背景所要显示的图形。CellPadding设置表单元格的边框和内容之间的距离(以像素为单位)。CellSpacing置表单元格之间的距离(以像素为单位)。Columns传回控件中所显示的字段数。只读属性。CurrectPageIndex设定控制项目前所在的数据页数,只能用程序设定。7.3.1DataGrid控件简介DataKeyField设定在数据源中为主键的字段。DataSource设定数据系结所要使用的数据源。EditItemIndex设定要被编辑的字段名称。本属性设为-1可放弃编辑。GridLines设定是否要显示网格线。本属性在RepeatLayout属性设为Table时才有效。HorizontalAlign设定水平对齐的方式ItemsDataListItem的集合对象。本对象只包含和数据源连结的Item,也就是说不包含Header、Footer及Separator模版。PageCount获取显示DataGrid控件中的总页数。只读属性PageSize获取或设置要在DataGrid控件的单页上显示的项数。SelectedIndex获取或设置DataGrid控件中选定项的索引。SelectedItem获取表示DataGrid控件中选定项的DataGridItem对象ShowFooter获取或设置一个值,该值指示页脚是否在DataGrid控件中显示。ShowHeader获取或设置一个值,该值指示是否在DataGrid控件中显示页眉VirtualItemCount获取或设置在使用自定义分页时DataGrid控件中的实际项数。7.3.1DataGrid控件简介事件名称说明OnCancelCommand当在字段中的Button或LinkButton控件触发事件时,如果控件的CommandName属性为Cancel时,则触发本事件。OnDeleteCommand当在字段中的Button或LinkButton控件触发事件时,如果控件的CommandName属性为Delete时,则触发本事件。OnEditCommand当在字段中的Button或LinkButton控件触发事件时,如果控件的CommandName属性为Edit时,则触发本事件。OnItemCommand当在字段中的Button或LinkButton控件触发事件时,如果CommandName属性的内容不是Edit、Cancel、Delete或Update时即触发本事件。OnItemCreated当DataList中的每一个项目被产生时触发。OnPageIndexChanged当不同的数据页被选取时便触发。OnSortCommand当使用者选择要排序的字段时,即触发本事件。本事件必须将DataGrid的AllowSorting属性设为True才会触发。OnUpdateCommand当在字段中的Button或LinkButton控件触发事件时,如果控件的CommandName属性为Update时,则触发本事件。7.3.1DataGrid控件简介利用以上以上介绍的控制DataGrid控件的属性,来看一个示例,考察一下DataGrid控件如何显示数据库中某一个表的数据。其源代码如下所示:代码清单w7-301.aspx<%@ImportNamespace="System.Data"%><%@ImportNamespace="System.Data.SqlClient"%><scriptlanguage="vb"runat="server">SubPage_Load(senderasObject,easEventArgs)BindData()EndSub
SubBindData()7.3.1DataGrid控件简介'1.建立连接DimmyConnectionasNewSqlConnection("DataSource=.;InitialCatalog=Dbemail_;UID=sa;PWD=")
'2.建立Command对象ConststrSQLasString="select*fromemailwhereid<17orderbyid"DimmyCommandasNewSqlCommand(strSQL,myConnection)'3.建立DataAdapterDimmyDAasNewSqlDataAdapter()myDA.SelectCommand=myCommand7.3.1DataGrid控件简介'4.组件DataSetDimmyDSasNewDataSet()myDA.Fill(myDS)
'5.捆绑数据dgPopularFAQs.DataSource=myDSdgPopularFAQs.DataBind()EndSub</script><html><body>7.3.1DataGrid控件简介<center><h3><fontface="Verdana">在数据库中选择一些数据用DataGrid控件显示</font></h3></center><formrunat="server"><asp:datagridid="dgPopularFAQs"runat="server"BorderWidth="0"CellPadding="2"Width="100%"Font-Name="Verdana"Font-Size="Smaller"HeaderStyle-HorizontalAlign="Center"HeaderStyle-Font-Bold="True"7.3.1DataGrid控件简介HeaderStyle-BackColor="Navy"HeaderStyle-ForeColor="White"AlternatingItemStyle-BackColor="#dddddd"></asp:datagrid></form></body></html>该示例在客户浏览器运行显示的结果如图7-301所示7.3.1DataGrid控件简介7.3.1DataGrid控件简介在本例中,为了使页能够访问执行SQL数据访问所需的类,必须将System.Data和System.Data.SqlClient命名空间导入到页中。<%@ImportNamespace="System.Data"%><%@ImportNamespace="System.Data.SqlClient"%>需要注意的是,上面代码中ConnectionString必须是合法的SQL数据库连接语句。比如,像以下格式的数据库连接(使用OleDb有一些细微的变化):server=IP地址;UID=用户名;pwd=密码;InitialCatalog=数据库名以上数据库连接、数据显示通过以下五步实现:1、连接到数据库;2、通过适当的SQL查询语句建立Command对象;3、建立DataAdp;4、通过请求得到的数据组建DataSet;5、捆绑DataSet到DataGrid;7.3.2DataGrid控件实现数据库记录的分页显示通常,Web应用程序中一种常见的情况是显示列表,例如搜索结果的列表或目录中产品的列表。如果搜索结果有5000条记录,那么仅在一页上显示肯定是不好的,这时就需要把这些搜索结果用分页的形式显示,同时为用户提供一种在这些页之间定位的方式。在ASP.NET没有发布之前,要实现记录的分页显示是一件很烦琐的事情,常常需要花费开发者许多的精力。现在,利用DataGrid控件就可以很轻松地完成这一工作,只需要为DataGrid控件设置几个属性就可以实现分页功能。DataGrid控件支持三种类型的分页:带有默认导航按钮的默认分页、带有自定义导航控件的默认分页、自定义分页。在表7-303中给出了这几种分页方式的说明。7.3.2DataGrid控件实现数据库记录的分页显示分页方式说明默认分页和默认导航按钮DataGrid控件将导航按钮显示为DataGrid控件的一部分。这些控件是“下一页”和“上一页”按钮或页码。当用户单击这些按钮时,网格更新当前页码并引发一个事件,以便可刷新数据。默认分页和自定义导航控件启用分页并设置DataGrid控件的页大小。然后在Web窗体页上放置导航控件,如“下一页”和“上一页”按钮。在这些按钮的单击事件中,操作DataGrid控件的当前页。然后该控件选择要显示的相应数据行。自定义分页您提供自己的导航控件,手动设置要显示的页,并提供仅用于该页的行。此选项使您得以一次移动任意数量的页、跳到特定页等等。7.3.2DataGrid控件实现数据库记录的分页显示1.数据分页的实现使用DataGrid要实现数据分页,只需要以下简单的几步就可以了:1)设置DataGrid控件的AllowPaging为True,其实就是设置DataGrid为允许分页显示;2)编写OnPageIndexChanged事件来处理分页请求;这样就可以了,针对刚才的举例,对以上代码中的DataGrid设置相应的属性和相关事件就可以实现数据分页了:7.3.2DataGrid控件实现数据库记录的分页显示<asp:datagridid="dgPopularFAQs"runat="server"BorderWidth="0"CellPadding="2"Width="100%"Font-Name="Verdana"Font-Size="Smaller"AutoGenerateColumns="False"HeaderStyle-HorizontalAlign="Center"HeaderStyle-Font-Bold="True"7.3.2DataGrid控件实现数据库记录的分页显示HeaderStyle-BackColor="Navy"HeaderStyle-ForeColor="White"AlternatingItemStyle-BackColor="#dddddd"AllowPaging="True"PageSize="5"OnPageIndexChanged="dgPopularFAQs_Paged"></asp:datagrid>在以上代码中,还有一个属性需要注意,那就是PageSize。这个属性设置分页以后每页显示数据的条数,在这里,每页显示5条,如果不定义此属性,控件默认显示10条数据信息。现在,需要做的只需定义数据分页事件,当用户点击新的页面编号时,将当前的页面编号CurrentPageIndex改为新的页面编号。以下是页面改变事件代码:7.3.2DataGrid控件实现数据库记录的分页显示<scriptlanguage="vb"runat="server">SubdgPopularFAQs_Paged(senderasObject,easDataGridPageChangedEventArgs)dgPopularFAQs.CurrentPageIndex=e.NewPageIndexBindData()EndSub</script>需要注意的是,当页面改变以后,我们需要重新绑定数据。相类似的情形,在第一次登载页面的时候,我们需要绑定数据,而以后再次刷新就不要再绑定了:<scriptlanguage="vb"runat="server">7.3.2DataGrid控件实现数据库记录的分页显示SubPage_Load(senderasObject,easEventArgs)IfNotPage.IsPostBackthenBindData()EndIfEndSub</script>其完整的源代码如下:代码清单w7-302.aspx<%@ImportNamespace="System.Data"%>7.3.2DataGrid控件实现数据库记录的分页显示<%@ImportNamespace="System.Data.SqlClient"%><scriptlanguage="vb"runat="server">SubPage_Load(senderasObject,easEventArgs) IfNotPage.IsPostBackthen BindData() End IfEndSubSubBindData()'1.建立连接DimmyConnectionasNewSqlConnection("DataSource=.;_InitialCatalog=DBemail;UID=sa;PWD=")7.3.2DataGrid控件实现数据库记录的分页显示
'2.建立Command对象ConststrSQLasString="select*fromemailorderbyid"DimmyCommandasNewSqlCommand(strSQL,myConnection)
'3.建立DataAdapterDimmyDAasNewSqlDataAdapter()myDA.SelectCommand=myCommand'4.组件DataSetDimmyDSasNewDataSet()myDA.Fill(myDS)'5.捆绑数据dgPopularFAQs.DataSource=myDSdgPopularFAQs.DataBind()EndSubSubdgPopularFAQs_Paged(senderasObject,easDataGridPageChangedEventArgs)dgPopularFAQs.CurrentPageIndex=e.NewPageIndexBindData()EndSub</script><html><body><center><h3><fontface="Verdana">数据库中数据用DataGrid控件分页显示</font></h3></center><formrunat="server"><asp:datagridid="dgPopularFAQs"runat="server"BorderWidth="0"CellPadding="2"Width="100%"Font-Name="Verdana"Font-Size="Smaller"HeaderStyle-HorizontalAlign="Center"HeaderStyle-Font-Bold="True"HeaderStyle-BackColor="Navy"HeaderStyle-ForeColor="White"AllowPaging="True"PageSize="5"7.3.2DataGridAlternatingItemStyle-BackColor="#dddddd"OnPageIndexChanged="dgPopularFAQs_Paged"></asp:datagrid></form></body></html>该示例在客户浏览器运行显示的结果如图7-302所示7.3.2DataGrid7.3.2DataGrid2.数据分页样式设定在DataGrid控件分页显示中,还可以用一些文字或数字来代替图7-302中“<”“>”的上一页和下一页的按钮。这种增强效果,可通过PagerStyle定义,代码以下:<asp:datagrid...><PagerStyleMode="<i>Mode</i>"NextPageText="<i>下一页</i>"PrevPageText="<i>上一页</i>"Position="<i>PagePosition</i>">7.3.2DataGrid</PagerStyle></asp:datagrid>以上代码中,Mode(页面模式)可以设置为:NextPrev或者NumericPages,其中,NextPrev页面模式用“下一页”和“上一页”按钮显示页导航控件;NumericPages页面模式显示表示各个页号的数值按钮。另外,Position(页码位置)可以设置为Top、Bottom或者TopAndBottom,如果。Position设置为Top,则页面导航按钮显示在DataGrid控件的上方;设置为Bottom,则页面导航按钮显示在DataGrid控件的下方;设置为TopAndBottom,则页面导航按钮在DataGrid控件的上方和下方都有显示。下面分别用这两种不同的页面模式来显示分页的效果,以看这两种方式的差异。1)NextPrev页面模式在例W7-302.aspx中加上如下的页面设置格式,具体添加的位置是在Datagrid控件之间。其在客户浏览器运行显示的结果如图7-303所示。<asp:datagridid="dgPopularFAQs"runat="server"7.3.2DataGridBorderWidth="0"CellPadding="2"Width="100%"Font-Name="Verdana"Font-Size="Smaller"HeaderStyle-HorizontalAlign="Center"HeaderStyle-Font-Bold="True"HeaderStyle-BackColor="Navy"HeaderStyle-ForeColor="White"AllowPaging="True"PageSize="5"7.3.2DataGridAlternatingItemStyle-BackColor="#dddddd"OnPageIndexChanged="dgPopularFAQs_Paged"><PagerStyle Mode="NextPrev"NextPageText="<i>下一页</i>"PrevPageText="<i>上一页</i>"Position="TopAndBottom"HorizontalAlign="Right"></PagerStyle></asp:datagrid>图7-303DataGrid控件页面显示模式设定(1)7.3.2DataGrid7.3.2DataGrid2)NumericPages页面模式当DataGrid控件的分页页面显示模式设置为NumericPages时,则页导航按钮是用一个个的数字来作为页面的导航的。默认情况,如果所筛选的记录超过10页以上时,在这种模式中,仅显示10个页面导航按钮。在例W7-302.aspx中加上如下的页面设置格式,具体添加的位置是在Datagrid控件之间。其在客户浏览器运行显示的结果如图7-304所示。<asp:datagridid="dgPopularFAQs"runat="server"….OnPageIndexChanged="dgPopularFAQs_Paged"><PagerStyleMode="NumericPages"Position="TopAndBottom"HorizontalAlign="Right"></PagerStyle></asp:datagrid>7.3.2DataGrid图7-304DataGrid控件页面显示模式设定(2)7.3.2DataGrid3)页面导航标志显示风格的属性说明在DataGrid控件控制页面导航的属性中,PagerStyle属性用于控制页面导航标志的属性。该属性除了可以利用Style对象的属性之外,还可以利用一些特殊的属性控制页面导航标志的显示风格,如表7-304所示。表7-304页面导航标志显示风格的属性7.3.2DataGrid属性描述PagerStyle-Mode获取或设置一个值,该值指定页导航元素是显示链接到下一页和前一页的按钮,还是显示直接与某一页链接的数值按钮。设定分页方式,NextPrev、NumericPages。PagerStyle-NextPageText获取或设置为下一页按钮显示的文本。PagerStyle-PrevPageText获取或设置为前一页按钮显示的文本。PagerStyle-Visible获取或设置一个值,该值指示是否在DataGrid控件中显示页导航。若要显示页导航,则为true;否则为false。默认值为true。PagerStyle-Position指定DataGrid控件中页导航元素显示的位置。页导航元素可以显示在DataGrid控件的上边缘、下边缘或同时显示在控件的上边缘和下边缘(Bottom、Top、TopAndBottom)。PagerStyleButtonCount获取或设置在DataGrid控件的页导航元素中同时显示的数值按钮的数目。如果DataGrid控件中的页数多于在此属性中指定的页数,则在页导航元素中显示省略号按钮(...)。在单击后,这些按钮显示数值按钮的下一组或前一组。7.3.2DataGrid3.分页显示的深入探讨以上实现分页很简单,但是,其中有一个很重要的问题需要探讨。在ASP.NET的框架中,当用户每一次点击新的页面导航按钮时,整个DataSet都要重新构建,如果这个DataSet数据量不是很多当然没有任何问题,但是如果有一个1000条数据或一万条数据的DataSet,每一次请求更改页面都要重新构建,那么,这种途径实现分页就不是很理想了。主要的原因是以上的方法是把所有符合条件的数据全部装载到内存了,这显然不是一种好的方法。所以,必须寻求别的方法解决,最好,每一次改变页面的时候,只是将需要显示的那些页面数据装载到内存,而不是所有页面的数据。由此可看出,前面提到的分页方法,其实只适合数据量比较小的情况。当数据量大的时候,采用以上方法将消耗大量资源。这时候,就不能再使用以上途径来实现分页了,可以使用DataGrid的AllowCustomPaging来实现。DataGrid的AllowCustomPaging属性可以实现以上功能。首先,将DataGrid的AllPaging和AllowCustomPaging属性都设置为True,然后,设置PageIndexChanged事件。在PageIndexChanged事件中,首先要将CurrentPageIndex属性设置为需要显示的页码;然后,构建一个只有一个页面数据的DataSource,然后绑定数据到DataGrid。7.3.2DataGrid当AllowCustomPaging为False的时候,DataGrid假设所有DataSource的数据都要求显示;DataGrid根据CurrentPageIndex和PageSize来决定显示那些数据,其实,这只是选择所有数据中的一部分显示,没显示的数据还在内存中,而且,每一次更换页面,DataGrid都将重新计算需要显示的页面数据。当AllowCustomPaging设置为True的时候,DataGrid根据VirtualItemCount和PageSize属性来决定那些数据需要显示,每次更换页面只装载需要显示的那部分数据。下面给出一个示例来说明,其源代码如下:7.3.2DataGrid代码清单w7-303.aspx<%@ImportNamespace="System.Data"%><html><scriptlanguage="VB"runat="server">Dimstart_indexAsIntegerFunctionCreateDataSource()AsICollectionDimdtAsNewDataTable()DimdrAsDataRowdt.Columns.Add(NewDataColumn("IntegerValue",GetType(Int32)))dt.Columns.Add(NewDataColumn("StringValue",GetType(String)))7.3.2DataGriddt.Columns.Add(NewDataColumn("CurrencyValue",GetType(Double)))DimiAsIntegerFori=start_indexTo(start_index+ItemsGrid.PageSize)-1dr=dt.NewRow()
dr(0)=i '每一行所生成的序号dr(1)="项目"+i.ToString() '每一行的项目名称dr(2)=1.23*(i+1) '每一行的单价
dt.Rows.Add(dr)Nexti7.3.2DataGridDimdvasnewDataView(dt)ReturndvEndfunction'CreateDataSource
Subpage_load(senderasobject,easEventArgs)Ifcheckbox1.CheckedthenItemsGrid.PagerStyle.Mode=PagerMode.NumericPagesElseItemsGrid.PagerStyle.Mode=PagerMode.NextPrevEndifIfnotIsPostBackthen7.3.2DataGridStart_index=0ItemsGrid.VirtualItemCount=100Endif BindGrid()Endsub'page_load
Subgrid_change(senderasobject,easDataGridPageChangedEventArgs)ItemsGrid.CurrentPageIndex=e.NewPageIndexStart_index=ItemsGrid.CurrentPageIndex*ItemsGrid.PageSizeBindGrid()Endsub'grid_change7.3.2DataGridSubBindGrid()ItemsGrid.DataSource=CreateDataSource()ItemsGrid.DataBind()EndSub'BindGrid</script>
<body><formrunat=server><center><h3>DataGrid控件通用分页程序示例</h3>
<asp:DataGridid="ItemsGrid"runat="server"BorderColor="black"BorderWidth="1"7.3.2DataGridCellPadding="3"AllowPaging="true"AllowCustomPaging="true"pagesize="5"AutoGenerateColumns="false"OnPageIndexChanged="grid_change"><PagerStyleNextPageText="forward"PrevPageText="back"Position="bottom"PageButtonCount="5"BackColor="#00aaaa"></PagerStyle>
7.3.2DataGrid<AlternatingItemStyleBackColor="yellow"></AlternatingItemStyle>
<HeaderStyleBackColor="#00aaaa"></HeaderStyle> <Columns><asp:BoundColumnHeaderText="序号"DataField="IntegerValue"/><asp:BoundColumnHeaderText="项目名称"DataField="StringValue"/><asp:BoundColumn7.3.2DataGridHeaderText="单价"DataField="CurrencyValue"DataFormatString="{0:c}"><ItemStyleHorizontalAlign="right"></ItemStyle>
</asp:BoundColumn>
</Columns></asp:DataGrid></center><br>7.3.2DataGrid当前页是:<fontcolor=red><%=ItemsGrid.CurrentPageIndex+1%></font><br>总页数是:<fontcolor=red><%=ItemsGrid.PageCount%></font><br><asp:CheckBoxid="CheckBox1"Text="页面导航按钮显示方式切换"AutoPostBack="true"runat="server"/></form></body></html>该Web程序在客户端浏览器中显示的结果如图7-305所示。当用户选中了“页面导航按钮显示方式切换”按钮后,在浏览器显示的结果如图7-306所示。7.3.2DataGrid图7-305DataGrid控件分页显示(1)图7-306DataGrid控件分页显示(2)7.3.3DataGrid记录排序7.3.3DataGrid控件对记录排序DataGrid服务器控件提供一种向网格中添加排序功能的途径,可以使用下列这些方法排序:
默认排序:网格中的所有列都可以排序。每列的标头包含一个LinkButton控件(超级链接),用户单击该控件可以按该列进行排序。
自定义排序:定义可将哪些列排序以及用户单击该列标头中什么类型的按钮进行排序。DataGrid控件并不具备自动排序功能,而是通过引发事件将排序请求通知给用户,用户在这个事件响应的代码中执行排序,方法通常是进行排序然后重新绑定到该数据源。要使DataGrid控件具有排序功能,必须对DataGrid控件的一个属性和一个方法进行设置。下面把排序所需要的属性和方法说明如下:7.3.3DataGrid记录排序AllowSorting属性:获取或设置指示DataGrid控件是否启用排序。该属性的取值是布尔类型,默认值是“False”。当该属性值取值为“True”时,表明允许DataGrid控件进行排序,此时,DataGrid控件显示标题的部分被页面解释成一个LinkButton控件。当用户单击了LinkButton控件之一时,将引发SortCommand事件,由该事件负责提供排序处理程序的代码。事件处理程序的典型逻辑是首先对列表排序,然后将数据重新绑定到DataGrid控件。
OnSortCommand方法:对列进行排序时发生。事件处理程序接收一个DataGridSortCommandEventArgs类型的参数,它包含与此事件相关的数据,其中有一个SortField属性,用来通知事件处理程序,DataGrid控件的哪一个标题名被用户单击了,可根据返回的SortField属性值进行相应的排序。下面通过一个示例来看一下,DataGrid控件是如何完成排序功能的。其源代码如下:7.3.3DataGrid记录排序代码清单w7-305.aspx<%@PageLanguage="vb"Debug="true"%><%@ImportNamespace="System.Data"%><%@ImportNamespace="System.Data.SqlClient"%><html><scriptlanguage="VB"runat="server">
DimSortExpressionAsString
FunctionCreateDataSource()AsdataviewDimdtAsNewDataTable()DimdrAsDataRowDimRand_NumAsNewRandom()7.3.3DataGrid记录排序DimmyConnectionasnewSqlConnection("datasource=.;_Initialcatalog=DBemail;UID=sa;PWD=")ConststrSQLasstring="select*fromemailorderbyid" DimmyCommandasnewSqlCommand(strSQL,myConnection) DimmyDAasnewSqlDataAdapter() myDA.SelectCommand=myCommand DimmyDSasnewdataset() myDA.Fill(myDS,"kkk")DimdvasDataViewdv=newdataview(myDS.Tables("kkk"))dv.Sort=SortExpressionReturndvEndfunction7.3.3DataGrid记录排序SubPage_Load(senderAsObject,eAsEventArgs)IfNotIsPostBackThenIfSortExpression=""ThenSortExpression="id" '第一次执行,初值按id值排序EndIfItemsGrid.DataSource=CreateDataSource()ItemsGrid.DataBind()EndIfEndSub'Page_Load
SubSort_Grid(senderAsObject,eAsDataGridSortCommandEventArgs)IfCheckBox1.CheckedThen7.3.3DataGrid记录排序SortExpression=e.SortExpression.ToString()&"desc" '默认是升序ElseSortExpression=e.SortExpression.ToString()&"asc" '降序EndIfItemsGrid.DataSource=CreateDataSource()ItemsGrid.DataBind()EndSub'Sort_Grid</script><body><formrunat=server><center><h3>DataGrid控件排序示例</h3></center><asp:CheckBoxid="CheckBox1"runat="server"text="降序"></asp:CheckBox>
7.3.3DataGrid记录排序<center><asp:DataGridid="ItemsGrid"runat="server"BorderColor="black"BorderWidth="1"CellPadding="3"AllowSorting="true"OnSortCommand="Sort_Grid"AutoGenerateColumns="true">
<HeaderStyleBackColor="#00aaaa">7.3.3DataGrid记录排序</HeaderStyle>
</asp:DataGrid></center></form></body></html>在本例中设置了一个SortExpression字符串变量,当某一个用户第一次用浏览器打开该页时,触发了Page_Load事件,在此事件中对该字符串变量赋初值为“id”(“id”是email表中的一个字段名),即默认是以id字段的升序对该网格进行排序,其在浏览器中的运行结果如图7-306所示。当用户选中了“降序”复选框后,然后单击网格中的“id”标题超级链接,则表格按“id”值的大小降序重新排列,其在浏览器中的运行结果如图7-307所示。另外,在本示例的源程序中,与排序有关的程序代码以黑体字突出显示。7.3.3DataGrid记录排序图7-306网络以id字段升序排列图7-307网络以id字段降序排列7.3.4DataGrid控件定制列元素1.概述DataGrid控件的所有列类型的基类是DataGridColumn类,它定义所有列类型所共有的属性和方法,可通过这些属性和方法对DataGrid控件的每一列进行操作。在表7-305中说明了DataGridColumn成员的常用属性。表7-305DataGridColumn成员的常用属性
属性说明FooterStyle获取列的脚注部分的样式属性。该属性为只读属性。FooterText获取或设置列的脚注部分中显示的文本。HeaderImageUrl获取或设置列标题中显示的图像的位置。HeaderStyle获取列标题的样式属性。该属性为只读属性。HeaderText获取或设置在列标题中显示的文本。Visible获取或设置一个值,该值指示此列在DataGrid控件中是否可见。Owner获取列是其成员之一的DataGrid控件。SortExpression获取或设置选择进行排序的列时传递到OnSortCommand方法的字段或表达式的名称。ItemStyle获取列的项单元格的样式属性7.3.4DataGrid控件定制列元素DataGrid控件在显示数据库的记录时,一般都是自动生成列对象。这时DataGrid控件的AutoGenerateColumn属性设置为True,表示会自动产生数据源中所有的字段。如果想自定义DataGrid控制所要显示的字段,只要将AutoGenerateColumn属性设为False,然后定义相应的列对象即可。其定义的语法如下所示:<asp:DataGrid…….><PropertyName="Columns"><ASP:BoundColumn/><ASP:ButtonColumn/><ASP:EditCommandColumn/><ASP:HyperlinkColumn/><ASP:TemplateColumn>样版设定...</ASP:TemplateColumn></Property></asp:DataGrid>DataGrid控件允许定义的字段,如下表7-306所示表7-306DataGrid控件允许定义的字段7.3.4DataGrid控件定制列元素字段说明BoundColumn字段内容以Label的方式显示。ButtonColumn字段内容以超级链接或是按钮的方式显示。EditCommandColumn提供数据修改的命令按钮,不呈现字段数据。HyperLinkColumn字段内容以超级链接的方式显示。TemplateColumn字段内容以自订样版的方式显示。7.3.
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
评论
0/150
提交评论