首 页 | 新 闻 | 技术中心 | 第二书店 | 《程序员》 | 《开发高手》 | 社 区 | 黄 页 | 人 才
移 动专 题SUNIBM微 软微 创精 华Donews人 邮
我的技术中心 
我的分类 我的文档
全部文章 发表文章
专栏管理 使用说明



 RSS 订阅 
最新文档列表
Windows/.NET
.NET  (rss)    
Visual C++  (rss)    
Delphi  (rss)    
Visual Basic  (rss)    
ASP  (rss)    
JavaScript  (rss)    
Java/Linux
Java  (rss)    
Perl  (rss)    
综合
其他开发语言  (rss)    
文件格式  (rss)    
企业开发
游戏开发  (rss)    
网站制作技术  (rss)    
数据库
数据库开发  (rss)    
软件工程
其他  (rss)    

积极原创作者 
iiprogram (68)
qdzx2008 (50)
goodboy1881 (14)
wangchinaking (58)
fancyhf (1)
harrymeng (41)
yjz0065 (113)
coofucoo (105)
Drate (69)
lphpc (30)
CSDN - 文档中心 - .NET 阅读:17327   评论: 34    参与评论
标题   让Asp.NET的DataGrid可排序、可选择、可分页     选择自 lihonggen0 的 Blog
关键字   DataGrid、排序、分页
出处  

  

Asp.NETDataGrid可排序、可选择、可分页

       DataGridAsp.NET中的一个重要的控件,经常我们都将DataGrid做成可分页的和可排序的,有时还需要加上选择功能。这些都是经常需要用到的方法,其实是比较简单的。

 

设计思路:

为了方便起见,我们连接SQL Server 2000NorthWind数据库的Orders表,从数据库里得到此表的数据视图。利用DataGridSortCommand事件实现排序用一个模板列加上CheckBox控件实现选择。可用DataGrid的属性生成器的“分页”选项或者自己修改HTML实现分页。

 

HTML

  • 添加一个DataGrid,命名为dgOrder
  • 添加了一个模板列,模板列里放一个名为CbCheckBox控件。此列用来实现选择
  • 为要排序的每个列加上排序表达式SortExpression
  • 利用列的DataFormatString来格式化列,象DataFormatString="{0:d}"显示日期格式。
  • 设置PageSize="15"每页显示15行数据,AllowPaging="True" 为允许分页

 

整个HTML页代码:

<form id="Form1" method="post" runat="server">

       <asp:datagrid id="dgOrder" runat="server" Height="515px" Width="718px" AutoGenerateColumns="False" AllowSorting="True" CellPadding="4" BorderWidth="1px" BorderColor="#A0ABEB" PageSize="15" BorderStyle="Solid" BackColor="White" GridLines="Vertical" ForeColor="Black" AllowPaging="True" ShowFooter="True">

              <SelectedItemStyle ForeColor="White" BackColor="Black"></SelectedItemStyle>

              <AlternatingItemStyle BackColor="#EEEEEE"></AlternatingItemStyle>

              <HeaderStyle HorizontalAlign="Center" ForeColor="White" BorderColor="#6876C5" BackColor="#6876C5"></HeaderStyle>

              <FooterStyle ForeColor="White" BackColor="#6876C5"></FooterStyle>

              <Columns>

                     <asp:TemplateColumn>

                            <ItemTemplate>

                                   <FONT face="宋体">

                                          <asp:CheckBox id="Cb" runat="server"></asp:CheckBox></FONT>

                            </ItemTemplate>

                     </asp:TemplateColumn>

                     <asp:BoundColumn DataField="orderid" SortExpression="orderid" HeaderText="ID">

                            <HeaderStyle Width="180px"></HeaderStyle>

                     </asp:BoundColumn>

                     <asp:BoundColumn DataField="ShipCountry" SortExpression="ShipCountry" HeaderText="ShipCountry">

                            <HeaderStyle Width="180px"></HeaderStyle>

                     </asp:BoundColumn>

                     <asp:BoundColumn DataField="ShippedDate" SortExpression="ShippedDate" HeaderText="ShippedDate" DataFormatString="{0:d}">

                            <HeaderStyle Width="180px"></HeaderStyle>

                     </asp:BoundColumn>

                     <asp:BoundColumn DataField="Freight" SortExpression="Freight" HeaderText="Freight">

                            <HeaderStyle Width="180px"></HeaderStyle>

                     </asp:BoundColumn>

                     <asp:BoundColumn DataField="ShipAddress" SortExpression="ShipAddress" HeaderText="ShipAddress">

                            <HeaderStyle Width="480px"></HeaderStyle>

                     </asp:BoundColumn>

              </Columns>

              <PagerStyle HorizontalAlign="Center" ForeColor="Black" Position="TopAndBottom" BackColor="White" Mode="NumericPages"></PagerStyle>

       </asp:datagrid>

</form>

 

 

 

后台类添加以下代码:

 

Imports System.Data.SqlClient

 

'得到数据视图,参数为要排序的列

Private Function GetDv(ByVal strSort As String) As DataView

        '定义数据库连接

        Dim dv As DataView

        Dim CN As New SqlConnection()

        Try

            '初始化连接字符串

            CN.ConnectionString = "data source=pmserver;initial catalog=Northwind;persist security info=False;user id=sa;Password=sa;"

            CN.Open()

'NorthWind得到orders表的数据

            Dim adp As SqlDataAdapter = New SqlDataAdapter("select * from orders", CN)

            Dim ds As New DataSet()

            adp.Fill(ds)

            '得到数据视图

            dv = ds.Tables(0).DefaultView

        Catch ex As Exception

#If DEBUG Then

            Session("Error") = ex.ToString()

            Response.Redirect("../error.aspx")        '跳转程序的公共错误处理页面

#End If

        Finally

            '关闭连接

            CN.Close()

        End Try

        '排序

        dv.Sort = strSort

        Return dv

    End Function

 

    Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        If Not IsPostBack Then

            ViewState("strSort") = "orderid"

            dgOrder.DataSource = GetDv(ViewState("strSort").ToString())

            dgOrder.DataBind()

        End If

    End Sub

       '排序

    Private Sub dgOrder_SortCommand(ByVal source As Object, ByVal e As System.Web.UI.WebControls.DataGridSortCommandEventArgs) Handles dgOrder.SortCommand

        dgOrder.CurrentPageIndex = 0

          '得到排序的列

        ViewState("strSort") = e.SortExpression.ToString()

        dgOrder.DataSource = GetDv(ViewState("strSort").ToString())

        dgOrder.DataBind()

    End Sub

 

       '分页

    Private Sub dgOrder_PageIndexChanged(ByVal source As Object, ByVal e As System.Web.UI.WebControls.DataGridPageChangedEventArgs) Handles dgOrder.PageIndexChanged

          '得到分页的页号

        dgOrder.CurrentPageIndex = e.NewPageIndex

        dgOrder.DataSource = GetDv(ViewState("strSort").ToString())

        dgOrder.DataBind()

    End Sub

运行结果如下图所示:(点击列标头可以排序)

 

为了知道用户选择的是哪些记录,我们可以利用DataGridItemFindControl得到CheckBox的值,我们来添加一个按钮,再写如下代码:

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

        Dim item As DataGridItem

        Dim StrScript As String

        StrScript = "<script language=javascript>alert('"

          '循环表格的项,FindControl

        For Each item In Me.dgOrder.Items

            If CType(item.FindControl("cb"), System.Web.UI.WebControls.CheckBox).Checked Then

                Try

                    StrScript += item.Cells(1).Text & Space(2)

                Catch ex As Exception

                End Try

            End If

        Next

        StrScript += "被选择!')</script>"

        RegisterClientScriptBlock("系统消息", StrScript)

    End Sub

 

上面的代码RegisterClientScriptBlock添加Java Script脚本弹出对话框。(其实Vb Script的对话框比Java Script的对话框多更多的显示和控制方式,但Netscape的浏览器不支持,大家可根据相应的项目在程序里选择用哪种脚本)。

 

 

 

 

总结:

DataGrid是我们常用的Web 控件,有时我们还可以和DataList混合使用,通过修改HTML页,可以达到好的页面效果。上面只是一个例子,为了便于清楚整个过程,我把数据访问部分(SQL)写到了页面中。在软件开发中,我们一般把访问数据的部分写成数据层,页面调用数据层得到数据,这样逻辑清晰,修改和维护都很方便。

 

‘***************************************************************

‘Author:  李洪根

‘MAIL:   lihonggen0@gci-corp.com

专栏:  http://www.csdn.net/develop/author/netauthor/lihonggen0/

如需引用,请指明出处! CSDN论坛VB版欢迎您!

‘***************************************************************

 


相关文章
对该文的评论
CSDN 网友 ( 2004-08-27)
 For Each item In Me.dgOrder.Items

            If CType(item.FindControl("cb"), System.Web.UI.WebControls.CheckBox).Checked Then

                Try

                    StrScript += item.Cells(1).Text & Space(2)

                Catch ex As Exception

                End Try

            End If

        Next

为什么我用这段就是执行到For就断了,有选择但到不了循环体呢
guxiangdefeng ( 2004-02-06)
请问how to 把textbox.text转化为数字型(向sql表中添加记录时ip可能是数字型的,how to把textbox的内容添加到ip项?在下是初学者,请说得详细些)
lihonggen0 ( 2003-12-05)
非常感谢大家的评论和参与!!
lihonggen0 ( 2003-12-05)

ASP.NET的一个最大的好处就是它不同于传统的ASP,它不需要你依赖于客户端脚本。你只需要知道如何使用你用托管代码写的服务器端控件就行了,ASP.NET会为你完成其它的工作。

使用脚本的一个缺点是它既不能保护脚本内的知识产权,也不能保证用户所看到的就是你所创造的成果。由于脚本作为普通文本储存,因此,每一级的脚本用户都能看到脚本设计者的原始编码,并能取出、修改它们。

比如说:下拉框有click事件,我们完全可以用code_behind方式在后台写代码,用户看不到代码吧!
如果用客户端脚本也可实现,但是代码会暴露。

当然“降低服务器压力”大家都知道,微软的网站www.asp.net是用asp.net的写的,每天几十万的访问量,它用的脚本也只是很少的一部分!

适当使用脚本是可以的,我不推荐全用脚本来写View !

本贴到此为止!.............
badcody ( 2003-12-05)
更正:

to lihonggen0 :

我不同意你的看法。
“如果不是需要和后台业务逻辑、数据库交互,只是涉及界面的表现的话应该尽量用客户端脚本,除非客户端脚本作不到或者做到要花太大的功夫。”
aspritionisdead 这句话说得好。

我们应该以[降低服务器压力]为目标来进行开发,像同步榜定ddl,row变色这些事件,如果全都用无谓的后台处理,我个人认为是不科学的。