datagrid控件是.net中最丰富最复杂的控件,它支持记录排序和分页!本文代码用VB.NET编写。
<%import namespace="system.data.oledb"%>
<script runat="server">
sub page_load
if not ispostback then
databind
end if
end sub
sub databind
dim strsql as string
dim objconn as oledbconnection
dim objcomm as oledbcommand
objconn = new oledbconnection("provider=microsoft.jet.oledb.4.0;data source="&server.mappath("*.mdb"))
strsql = "select * from table_name "
objcomm = new oledbcommand(strsql,objconn)
objconn.open()
mydgrd.datasource=objcomm.executereader()
mydgrd.databind()
objconn.close()
end sub
</script>
<html><body>
<asp:datagrid
id = "mydgrd"
runat="server"
/>
</body></html>
上面代码就不需要解释很多了,第一行是导入名称空间,这里用的是ACCESS数据库,如果是用SQL的话就应该是<%@ import namespace="system.data.sqlclient"%>
在这里,ID为"mydgrd"的datagrid控件将显示数据表中的所有字段的值,但有时我们并不需要显示所有的字段值,如何实现呢?那就要修改datagrid控件的autogeneratecolumns属性了,默认下是true,表示显示数据表中的所有字段值,如果设为false则可由我们自己控制了!现在修改一下上面的代码!
<%import namespace="system.data.oledb"%>
<script runat="server">
sub page_load
if not ispostback then
databind
end if
end sub
sub databind
dim strsql as string
dim objconn as oledbconnection
dim objcomm as oledbcommand
objconn = new oledbconnection("provider=microsoft.jet.oledb.4.0;data source="&server.mappath("*.mdb"))
strsql = "select * from table_name "
objcomm = new oledbcommand(strsql,objconn)
objconn.open()
mydgrd.datasource=objcomm.executereader()
mydgrd.databind()
objconn.close()
end sub
</script>
<html><body>
<asp:datagrid
autogeneratecolumns = "false"
id = "mydgrd"
runat="server"
>
<columns>
<asp:boundcolumn
headertext="作者"
datafield="authors"
/>
<asp:boundcolumn
headertext="联系电话"
datafield="phone"
/>
</columns>
<asp:datagrid>
</body></html>
注意:
此时我们在datagrid控件中设置了autogeneratecolumns=false,这表示不允许datagrid自动生成列,此时可以由我们自己控制了,然后
<columns>
<asp:boundcolumn
headertext="作者"
datafield="authors"
/>
<asp:boundcolumn
headertext="联系电话"
datafield="phone"
/>
</columns>
<columns>标记代表datagrid中的所有列,boundcolumn是datagrid的默认列,用来显示记录。这里我们声明了二个boundcolumn列,并用headertext属性定义了该列的字段名为"作者",否则默认时会显示authors了,该列的值来自数据表中的authors字段.接下来用一个bouncolumn列显示phone,每位作者的联系电话。所以该代码的执行效果会与上一个完全不同,它只会显示authors和phone二字段的值!
上面我们谈到了在datagrid控件中显示数据,并且也谈到了在datagrid控件中显示部分数据,但在测试的过程中发现,如果数据表中有1000条记录,则datagrid控件中会对应地生成1001行,很明显,这不符合我们的习惯,所以这次我来介绍一下在datagrid对记录进行分页!
对于分页功能,有一个要求,只有在datagrid控件的数据源实现了Icollection接口的情况下启用分页功能,datareader没有实现此接口,所以要使用datatable来代替,关于datatable请参考我写的dataset初步,可在文章系统中找到。
在datagrid控件中进行分页不需要像ASP中那样,只需要一个子过程和触发此子过程的事件就行了,与ASP比起来显得简单得多。不多说了,let's Go!
<%@ import namespace="system.data.oledb"%>
<%@ import namespace="system.data"%>
<script runat="server">
sub page_load
if not ispostback then
databind
end if
end sub
sub databind
dim strconn as string
dim strsql as string
dim mydst as dataset()
dim mydad as dataadapter
dim objconn as oledbconnection
strconn = "provider=microsoft.jet.oledb.4.0;data source="&server.mappath("your_database.mdb")
strsql = "select * from table_name "
mydst = new dataset()
objconn = new oledbconnection(strconn)
mydad = new oledbdataadapter(strsql,objconn)
mydad.fill(mydst)
mydatagrid.datasource=mydst
mydatagrid.databind()
end sub
sub page_changed(s as object, e as datagridpageindexchangedeventargs)
mydatagrid.currentpageindex=e.newpageindex
databind
end sub
</script>
<body>
<form runat="server">
<asp:datagrid
id="mydatagrid"
allowpaging="true"
onpageindexchanged="page_changed"
pagerstyle-mode="numericpages"
pagesize="15"
runat="server"
/>
</form>
</body>
下面来分析一下代码,这段代码与前面比起来有一部分差异,首先我们导入了一个新的名称空间<%@ import namespace="system.data"%>,因为前面说过了,要启用分页功能必须要实现Icollection接口,所以要导入system.data名称空间;然后写了三个子过程,第一个子过程在页面被初次调用时就进行databind子过程。第二个子过程就是前面说过的进行数据绑定了。关键看第三个子过程,过程名为page_changed,注意它的二个参数,当触发此子过程时,把名为mydatagrid控件的当前页面索引值改为新的索引值mydatagrid.currentpageindex=e.newpageindex,然后重新绑定数据到该控件上。
page_changed子过程在什么情况下被触发呢?所以我们在datagrid控件中重新设置了4个属性值:
allowpaging="true"
onpageindexchanged="page_changed"
pagerstyle-mode="numericpages"
pagesize="15"
第一行代码是允许进行分页,如果想实现分页功能,该属性必须设置成true,默认下是false
第二行是触发page_changed子过程的事件
第三行是设置分页导航的显示模式,这里设置是数字模式,即1 2 3 4 5 ……,默认是nextprev(上一页 下一页)
第四行是设置每页显示的记录数,这里设定是每页显示15第记录,默认为10条记录
通过这些代码就可以实现datagrid的分页功能了,当然这里会显示数据表中的所有字段,如果不想显示所有字段,请相应地把datagrid的autogeneratecolumns改成false,具体方法请参考前面的教程。
好了,实现datagrid的分页功能就已经完成了,在后面将介绍datagrid的排序功能!
下面谈一下在datagrid控件中对字段进行排序,要想允许对datagrid中的列进行排序,应将allowsorting属性值设为true并将一个子过程与sortcommand事件相关联,还是以例子进行说明:
<%@ import namespace="system.data.oledb"%>
<script runat="server">
sub page_load
if not ispostback then
databind("id")
end if
end sub
sub databind(strsort as string)
dim strconn as string
dim strsql as string
dim objconn as oledbconnection
strconn = "provider=microsoft.jet.oledb.4.0;data source="&server.mappath("your_database.mdb")
strsql = "select * from table_name order by "&strsort
objconn = new oledbconnection(strconn)
objconn.open()
&nb