ASP.NET网页编程之ASP.NET:DataGrid控件的分页功能
无论谁倒了对双方阵营的粉丝们也是有害无益。asp.net|datagrid|datagrid控件|分页 DataGrid控件是一个基于模板款式的、多功效的、多列的数据绑定控件。在三个数据绑定控件中,DataGrid是功效最为壮大的,其次时DataList控件,然后是轻量级的数据绑定控件Repeater。要自界说DataGrid中各列的结构,您能够将列范例设置为“模板”,然后修正列的模板。DataGrid控件也能够无需模板,只需依照默许的设置便可举行出现,这使得该控件成了用于呈报计划的幻想控件。我们能够把DataGrid了解成是HTML内里的一个Table,Table是由行(TR)和列(TD)构成,而DataGrid的行实际上是DataGridItem工具,而列就是DataGridColumn工具。在DataGrid工具的属性集了我们能够看到Items和Columns属性,它们分离就是DataGrid的行集和列集,也就是DataGridItem工具汇合及DataGridColumn工具汇合。经由过程检察ASP.NET天生的HTML页的源代码,我们也能够发明,DataGrid的体现情势也就是Table。我们也能够把DataGrid了解成数据库内里的表,也是由行和列构成。就像我们建数据库表一样,我们起首要机关表的列,在创立一个DataGrid工具时,我们也是要先创立DataGrid的列。DataGrid的列有以下几品种型:BoundColumn(绑定列)、ButtonColumn(按钮列)、EditCommandColumn(编纂命令列)、HyperLinkColumn(超链接列)、TemplateColumn(模板列)。在利用hoDataGrid控件时分依据分歧的范例,DataGrid控件就能够举行选择、编纂、删除、分页和排序。在本节里,我们将依据DataGrid控件经常使用的三年夜功效来具体先容。
9.2DataGrid控件的详解
9.2.1DataGrid控件的分页功效
在以往的ASP编程中,我们要完成页面的分页,就得消费良多的工夫编写代码来完成,可是在ASP.NET里,我们只必要对DataGrid控件的属性举行得当的设置,在指指导点中,就可以完成壮大的分页功效。
像其他控件一样,在利用DataGrid控件之前,也必需援用声明,因为DataGrid控件的属性和选项属性对照多,上面列出几个经常使用的属性,格局以下:
<asp:DataGrid
id="DataGrid1"
runat="server"
AllowPaging="True"
AllowSorting="True">
<SelectedItemStyleBackColor="#FFC080"></SelectedItemStyle>
<EditItemStyleBorderColor="#E0E0E0"BackColor="Gray"></EditItemStyle>
<ItemStyleBorderColor="#C0C0FF"BackColor="#E0E0E0"></ItemStyle>
<HeaderStyleBorderColor="#C0C0FF"BackColor="#E0E0E0"></HeaderStyle>
<FooterStyleBorderColor="#E0E0E0"BackColor="Silver"></FooterStyle>
<PagerStyleNextPageText=">上一页"PrevPageText="<下一页"HorizontalAlign="Center"ForeColor="White"
BackColor="#336666"Mode="NumericPages"></PagerStyle>
</asp:DataGrid>
下面这些属性是DtataGrid控件几个经常使用的模板设置,个中几个我们对照陌生的是<HeaderStyle>、<FooterStyle>、<ItemStyle>和<AllowPaging>属性。
HeaderStyle:是用来这是表格页眉的款式,包含背景致,字体,表格宽度等等;
FooterStyle:是用来设置表格底脚款式,包含背景致,字体,表格宽度等等;
ItemStyle:是用来设置表格注释的款式,包含背景致,字体,表格宽度等等;
EditItemStyle:用来设置编纂选项的款式;
AllowPaging:暗示是不是同意分页,假如为False,则DataGrid控件将数据一页显现。
AllowSorting:暗示是不是同意对字段举行排序。
PagerStyle:用来设置分页款式。能够为“123”数字毗连,也能够为“上一页下一页”款式的毗连。
关于DataGrid控件的款式,VisualStudio.NET2003供应了几种模板款式供用户套用,也能够使用属性天生器自行天生款式。我们能够经由过程DataGrid控件的属性面板里找到,如.4所示。
.4DataGrid控件的属性面板
我们先经由过程一个实例来复杂的懂得DataGrid的分页功效。
在DataConWeb项目里新建一个Web窗体,定名为DataGrid_Sample1.aspx,并为DataGrid_Sample1.aspx增加一个DataGrid1控件,如.5所示。
.5为DataGrid_Sample1.aspx增加控件
DataGrid_Sample1.aspx页面的次要HTML代码以下:
<formid="Form1"method="post"runat="server">
<asp:DataGrid
id="DataGrid1"
runat="server"
AllowPaging="True"
PageSize="5">
<ItemStyleFont-Size="X-Small"BorderColor="#C0C0FF">
</ItemStyle>
<HeaderStyleFont-Size="X-Small"
BorderColor="#C0C0FF"BackColor="#99CCCC"></HeaderStyle>
<PagerStyleNextPageText="[下一页]"Font-Size="X-Small"
PrevPageText="[上一页]"BackColor="#66CCCC"></PagerStyle>
</asp:DataGrid>
</form>
DataGrid1控件的属性在下面的HTML代码中已设置好了,那末,我们上面体贴的就是数据绑定部分了。固然,任何数据绑定是少不了与数据库的毗连事情。
DataGrid_Sample1.aspx的逻辑代码页面(DataGrid_Sample1.aspx.vb)中的代码以下:
----codebegin----
引进定名空间
ImportsSystem
ImportsSystem.Data
ImportsSystem.Web.UI
PublicClassDataGrid_Sample1
InheritsSystem.Web.UI.Page
#Region"Web窗体计划器天生的代码"
此处省略了窗体计划器天生的代码
#EndRegion
PrivateSubPage_Load(ByValsenderAsSystem.Object,ByValeAsSystem.EventArgs)HandlesMyBase.Load
在此处安排初始化页的用户代码
IfNotIsPostBackThen
判别是不是是第一次扫瞄该页面
挪用数据绑定历程
getdata()
EndIf
EndSub
读取数据信息
Subgetdata()
DimconnstrAsString声明数据库毗连字符
DimmyconAsOleDb.OleDbConnection
由于利用Aeecss数据库,以是声明OleDConnention工具
DimmycmdAsOleDb.OleDbDataAdapter
声明DataAdapter工具
DimmysqlAsString
声明Command命令的SQL字符串
Try
connstr="provider=microsoft.jet.oledb.4.0;datasource="+Server.MapPath(".")+"StudentInfor.mdb"
为毗连字符串赋值
mycon=NewOleDb.OleDbConnection(connstr)
实例化Connection工具
mysql="Selectid,name,sex,class,tel,emailfromstudent"
设置SQL语句,即查询数据库中一切内容
mycmd=NewOleDb.OleDbDataAdapter(mysql,mycon)
DimdtAsData.DataSet=NewData.DataSet
声明DataSet工具,并实例话
mycmd.Fill(dt)
添补数据,即在内存中天生DataSet模子数据库
DataGrid1.DataSource=dt.Tables(0)
为DataGrid1控件指定命据源
DataGrid1.DataBind()
实行绑定
CatchexAsException
Response.Write("程序堕落,信息形貌以下:<br>"&ex.Message)
Finally
mycon.Close()
EndTry
EndSub
DataGrid1控件的翻页事务
PrivateSubDataGrid1_PageIndexChanged(ByValsourceAsObject,ByValeAsSystem.Web.UI.WebControls.DataGridPageChangedEventArgs)HandlesDataGrid1.PageIndexChanged
DataGrid1.CurrentPageIndex=e.NewPageIndex
getdata()
EndSub
EndClass
--codeend-----
在DataGrid1控件的翻页事务过程当中,“DataGrid1.CurrentPageIndex=e.NewPageIndex”语句变动了DataGrid1控件以后页码,然后挪用getdata历程来猎取数据。在这条语句里CurrentPageIndex暗示以后页面索引,NewPageIndex暗示哀求的新的页码索引。这里我们必要注重的时,DataGrid控件的PageIndex属性值是从0入手下手的,也就是说PageIndex的最小值是0,最年夜值是DagaGrid.PageCount-1。
保留编译后,预览了局如.6所示。
.6DataGrid_Sample1.aspx运转了局
下面我们已讲过,翻页链接可使用数字,我们再经由过程一个实例来考证一下。
在DataConWeb项目里新建一个WebForm,定名为DataGrid_Sample2.aspx,增加一个DataGrid2控件,属性设置以下:
<asp:DataGrid
id="DataGrid1"
runat="server"
PageSize="6"
AllowPaging="True"
BorderColor="#CCCCCC"
BorderStyle="None"BorderWidth="1px"
BackColor="White"CellPadding="3">
<SelectedItemStyleFont-Bold="True"ForeColor="White"BackColor="#669999"></SelectedItemStyle>
<ItemStyleFont-Size="X-Small"ForeColor="#000066"></ItemStyle>
<HeaderStyleFont-Size="X-Small"Font-Bold="True"ForeColor="White"BackColor="#006699"></HeaderStyle>
<FooterStyleForeColor="#000066"BackColor="White"></FooterStyle>
<PagerStyleFont-Size="X-Small"HorizontalAlign="Left"ForeColor="#000066"BackColor="White"
PageButtonCount="6"Mode="NumericPages"></PagerStyle>
</asp:DataGrid>
个中上面这个属性里
<PagerStyleFont-Size="X-Small"HorizontalAlign="Left"ForeColor="#000066"BackColor="White"
PageButtonCount="6"Mode="NumericPages"></PagerStyle>
Mode="NumericPages"暗示分页毗连利用数字,PageButtonCount="6"暗示毗连数有6个。
DataGrid_Sample2.aspx.vb中的代码内容以下:
----codebegin----
引进定名空间
ImportsSystem
ImportsSystem.Data
ImportsSystem.Web.UI
PublicClassDataGrid_Sample2
InheritsSystem.Web.UI.Page
#Region"Web窗体计划器天生的代码"
此处省略了窗体计划器天生的代码,以勤俭篇幅
#EndRegion
PrivateSubPage_Load(ByValsenderAsSystem.Object,ByValeAsSystem.EventArgs)HandlesMyBase.Load
在此处安排初始化页的用户代码
IfNotIsPostBackThen
判别是不是是第一次扫瞄该页面
挪用数据绑定历程
getdata()
EndIf
EndSub
分页历程
Subgetdata()
DimconnstrAsString声明数据库毗连字符
DimmyconAsOleDb.OleDbConnection
由于利用Aeecss数据库,以是声明OleDConnention工具
DimmycmdAsOleDb.OleDbDataAdapter
声明DataAdapter工具
DimmysqlAsString
声明Command命令的SQL字符串
Try
connstr="provider=microsoft.jet.oledb.4.0;datasource="+Server.MapPath(".")+"StudentInfor.mdb"
为毗连字符串赋值
mycon=NewOleDb.OleDbConnection(connstr)
实例化Connection工具
mysql="Selectid,name,sex,class,tel,emailfromstudent"
设置SQL语句,即查询数据库中一切内容
mycmd=NewOleDb.OleDbDataAdapter(mysql,mycon)
DimdtAsData.DataSet=NewData.DataSet
声明DataSet工具,并实例话
mycmd.Fill(dt)
添补数据,即在内存中天生DataSet模子数据库
DataGrid1.DataSource=dt.Tables(0)
为DataGrid1控件指定命据源
DataGrid1.DataBind()
实行绑定
CatchexAsException
Response.Write("程序堕落,信息形貌以下:<br>"&ex.Message)
Finally
mycon.Close()
EndTry
EndSub
PrivateSubDataGrid1_PageIndexChanged(ByValsourceAsObject,ByValeAsSystem.Web.UI.WebControls.DataGridPageChangedEventArgs)HandlesDataGrid1.PageIndexChanged
DataGrid1.CurrentPageIndex=e.NewPageIndex
getdata()
EndSub
EndClass
---codeend-----------
仔细的读者发明,DataGrid_Sample1.aspx.vb和DataGrid_Sample2.aspx.vb中有关DataGrid控件的次要事务历程代码一样的。不错,关于逻辑代码部分来说,二者的确没有改动任何代码,我们仅仅改动了一下DataGrid控件的属性设置,可是却失掉了分歧作风的效果。以是,使用DataGrid控件的丰厚的模版,能够在不改动逻辑代码的情形下出现不懂的作风款式。
保留编译后,DataGrid_Sample2.aspx.vb预览了局如.7所示。
.7DataGrid_Sample2.aspx运转了局
我们来剖析DataGrid控件的分页功效在以上两个实例中使用。经由过程剖析代码我们晓得:当客户端哀求翻页时分,ASP.NET将实行由.NET框架托付的同名事务DDPageIndexChanged事务,经由过程这个事务历程到达分页目标。分页机制次要表现在上段的DataGrid1.CurrentPageIndex=e.NewPageIndex语句中。在使用OleDbDataAdapter工具读取数据后,往DataSet工具中添补数据的就是CurrentPageIndex和PageSize两个属性。OleDbDataAdapter从数据库中依照必定的纪录排序体例读出数据后,把从第(CurrentPageIndex*PageSize)笔记录入手下手到第(CurrentPageIndex*PageSize+PageSize)笔记录添补到DataSet里,构成一个满页的纪录,然后在绑定到DataGrid,然后经由过程DataGrid控件显现出来,就是哀求的页面。实质上就是使用DataAdapter工具Fill办法的几个重载。可是这个历程关于利用这类分页体例的用户来讲是通明的,因而我们无需编写任何代码,统统由.NET框架运转库完成。如许的优点是其实不必要几编程技能,只需指指导点,分页效果就完成了。欠好的中央就是短少天真性。当我们必要一个多样化,本性化的分页效果的时分,我们就要使用复杂编程的体例来完成。
上面这个实例中,我们将能够依据DataGrid分页机制,经由过程编程做一个非常有本性、功效非常完美的分页效果。
在DataConWeb项目里新建一个Web窗体,定名为DataGrid_Sample3.aspx,并增加一个DataGrid控件,四个LinkButton控件,一个DropDownList控件,一个Label1控件,一个TextBox控件,一个Button控件,一个正轨则表达式考证控件。
DataGrid_Sample3.aspx的次要HTML代码以下:
<formid="Form1"method="post"runat="server">
<FONTface="宋体">
<asp:DataGrid
id="DataGrid1"
runat="server"Width="368px"Height="144px"AllowPaging="True"AllowCustomPaging="True"
PageSize="999">
<ItemStyleFont-Size="X-Small"></ItemStyle>
<HeaderStyleBackColor="SkyBlue"></HeaderStyle>
<PagerStyleVisible="False"PageButtonCount="5"Mode="NumericPages"></PagerStyle>
</asp:DataGrid><br>
<asp:LinkButton
id="LinkButton1"runat="server"
Font-Size="X-Small">第一页</asp:LinkButton>
<asp:LinkButton
id="LinkButton2"runat="server"
Font-Size="X-Small">上一页</asp:LinkButton>
<asp:LinkButton
id="LinkButton3"runat="server"
Font-Size="X-Small">下一页</asp:LinkButton>
<asp:LinkButton
id="LinkButton4"runat="server"
Font-Size="X-Small">最初页</asp:LinkButton>
<asp:Label
id="Label1"runat="server"Width="168px"
Font-Size="X-Small">Label</asp:Label>
<br>
每页纪录条数
<asp:DropDownList
id="DropDownList1"runat="server"
Height="32px"Width="48px"AutoPostBack="True">
<asp:ListItemValue="3">3</asp:ListItem>
<asp:ListItemValue="5">5</asp:ListItem>
<asp:ListItemValue="7"Selected="True">7</asp:ListItem>
<asp:ListItemValue="9">9</asp:ListItem>
<asp:ListItemValue="12">12</asp:ListItem>
<asp:ListItemValue="15">15</asp:ListItem>
</asp:DropDownList>
跳转至
<asp:TextBox
id="TextBox1"runat="server"Width="48px"></asp:TextBox>
<asp:Buttonid="Button1"runat="server"
Width="40px"Text="->Go"></asp:Button>
<asp:RegularExpressionValidator
id="RegularExpressionValidator1"runat="server"
Font-Size="XX-Small"ErrorMessage="请输出准确的页码"
ValidationExpression="{1}d{0,}"
ControlToValidate="TextBox1">
</asp:RegularExpressionValidator>
</FONT>
</form>
DataGrid_Sample3.aspx.vb的代码以下:
----codebegin----
引进称号空间
ImportsSystem
ImportsSystem.Data
ImportsSystem.Web.UI
PublicClassDataGrid_Sample3_aspx
InheritsSystem.Web.UI.Page
#Region"Web窗体计划器天生的代码"
此处省略了窗体计划器天生的代码,以勤俭篇幅
#EndRegion
PrivateSubPage_Load(ByValsenderAsSystem.Object,ByValeAsSystem.EventArgs)HandlesMyBase.Load
在此处安排初始化页的用户代码
IfNotIsPostBackThen
viewstate("startpage")=0
使用viewstate("startpage")来保留DataGrid1以后页码索引
初始化为0,即第一页
viewstate("PageSize")=7
viewstate("PageSize")来保留PageSize,初始化为7
EndIf
getdata()条用分页历程
EndSub
编写读取数据通用历程,使用该历程读出数据,依据指定命据举行分页,
并绑定到DataGrid控件上
Subgetdata()
DimconnstrAsString声明数据库毗连字符
DimmyconAsOleDb.OleDbConnection
由于利用Aeecss数据库,以是声明OleDConnention工具
DimmycmdAsOleDb.OleDbDataAdapter
声明DataAdapter工具
DimmysqlAsString
声明Command命令的SQL字符串
Try
connstr="provider=microsoft.jet.oledb.4.0;datasource="+Server.MapPath(".")+"StudentInfor.mdb"
为毗连字符串赋值
mycon=NewOleDb.OleDbConnection(connstr)
实例化Connection工具
mysql="Selectid,name,sex,class,tel,emailfromstudent"
设置SQL语句,即查询数据库中一切内容
mycmd=NewOleDb.OleDbDataAdapter(mysql,mycon)
DimdtAsData.DataSet=NewData.DataSet
声明DataSet工具,并实例话
mycmd.Fill(dt,viewstate("startpage")*viewstate("PageSize"),viewstate("PageSize"),"infor")
添补数据,即在内存中天生DataSet模子数据库
使用DataAdapter.Fill的重载功效,viewstate("startpage")*viewstate("PageSize")伺机了局是第几笔记录
DataGrid1.DataSource=dt.Tables("infor")
为DataGrid1控件指定命据源
DataGrid1.DataBind()
实行绑定
CatchexAsException
Response.Write("程序堕落,信息形貌以下:<br>"&ex.Message)
Finally
mycon.Close()
EndTry
getpages()
EndSub
猎取纪录分页信息
Subgetpages()
DimmyconAsOleDb.OleDbConnection=NewOleDb.OleDbConnection("provider=microsoft.jet.oledb.4.0;datasource="&Server.MapPath(".")&"StudentInfor.mdb")
mycon.Open()
Try
DimmycmdAsOleDb.OleDbCommand=NewOleDb.OleDbCommand("selectcount(*)fromstudent",mycon)
viewstate("pc")=mycmd.ExecuteScalarviewstate("PageSize")+1
Label1.Text="以后为第["&(viewstate("startpage")+1).ToString&"]页/共["&(viewstate("pc"))&"]页"
CatchexAsException
Response.Write("程序堕落,信息形貌以下:<br>"&ex.Message)
Finally
mycon.Close()
EndTry
EndSub
跳转至第一页
PrivateSubLinkButton1_Click(ByValsenderAsSystem.Object,ByValeAsSystem.EventArgs)HandlesLinkButton1.Click
Ifviewstate("startpage")0Then
假如以后页面不是第一页则实行
viewstate("startpage")=0
EndIf
getdata()
EndSub
跳转至上一页,即页码减1
PrivateSubLinkButton2_Click(ByValsenderAsSystem.Object,ByValeAsSystem.EventArgs)HandlesLinkButton2.Click
Ifviewstate("startpage")>0Then
假如以后页码索引年夜于0则实行
viewstate("startpage")=viewstate("startpage")-1
EndIf
getdata()
EndSub
跳转至下一页,即页码加1
PrivateSubLinkButton3_Click(ByValsenderAsSystem.Object,ByValeAsSystem.EventArgs)HandlesLinkButton3.Click
Ifviewstate("startpage")<viewstate("pc")-1Then
假如以后页码索引小于(总页数-1)时则实行
viewstate("startpage")=viewstate("startpage")+1
EndIf
getdata()
EndSub
跳转至最初一页
PrivateSubLinkButton4_Click(ByValsenderAsSystem.Object,ByValeAsSystem.EventArgs)HandlesLinkButton4.Click
Ifviewstate("startpage")viewstate("pc")-1Then
假如以后页面不是最初一页则实行
viewstate("startpage")=viewstate("pc")-1
EndIf
getdata()
EndSub
跳转至选中页码
PrivateSubDropDownList1_SelectedIndexChanged(ByValsenderAsSystem.Object,ByValeAsSystem.EventArgs)HandlesDropDownList1.SelectedIndexChanged
viewstate("PageSize")=DropDownList1.SelectedValue
viewstate("startpage")=0
getdata()
EndSub
跳转至手工输出的代码页码
PrivateSubButton1_Click(ByValsenderAsSystem.Object,ByValeAsSystem.EventArgs)HandlesButton1.Click
IfInt(TextBox1.Text)<=viewstate("pc")Then
viewstate("startpage")=Int(TextBox1.Text)-1
getdata()
EndIf
EndSub
EndClass
-----codeend----------
保留编译后,预览效果以下图所示9.8所示。
.8DataGrid_Sample3.aspx运转了局
对于new隐藏成员的作用,往往是出于使用了一个第三方类库,而你又无法获得这个类库的源代码,当你继承这个类库的某个类时,你需要重新实现其中的一个方法,而又需要与父类中的函数使用同样的函数,这是就需要在自定义的子类中把那个同名函数(或成员)加上new标记,从而隐藏父类中同名的成员。 ASP.net的服务器,要求安装一个.net环境,当然我这里指的是windows系统,顺便点一下,.net只能放在windows环境里来运行。Asp.net1.1的就装Framework1.1,Asp.net2.0的就装Framework2.0。 同时也感谢博客园给我们这个平台,也感谢博客园的编辑们做成专题引来这么多高人指点。 使用普通的文本编辑器编写,如记事本就可以完成。由脚本在服务器上而不是客户端运行,ASP所使用的脚本语言都在服务端上运行,用户端的浏览器不需要提供任何别的支持,这样大提高了用户与服务器之间的交互的速度。 比如封装性、继承性、多态性等等,这就解决了刚才谈到的ASP的那些弱点。封装性使得代码逻辑清晰,易于管理,并且应用到ASP.Net上就可以使业务逻辑和Html页面分离,这样无论页面原型如何改变。 ASP.net的服务器,要求安装一个.net环境,当然我这里指的是windows系统,顺便点一下,.net只能放在windows环境里来运行。Asp.net1.1的就装Framework1.1,Asp.net2.0的就装Framework2.0。 ASP.net的速度是ASP不能比拟的。ASP.net是编译语言,所以,当第一次加载的时候,它会把所有的程序进行编译(其中包括worker进程,还有对语法进行编译,形成一个程序集),当程序编译后,执行速度几乎为0。 是指转换后的Servlet程序代码的行数。这给调试代码带来一定困难。所以,在排除错误时,可以采取分段排除的方法(在可能出错的代码前后输出一些字符串,用字符串是否被输出来确定代码段从哪里开始出错)。
页:
[1]