2012年7月15日 星期日

GridView和分頁(paging)有關的事件

分頁paging是大型控制項自帶的功能,但如果和編輯功能一起用的話,使用者若是在編輯模式底下切換頁面,正在編輯的資料也不會存回資料庫,所以設置PageIndexChanging 事件,如果在編輯模式下換頁會出現警告訊息並停止換頁,另外設計供使用者自訂的「分頁」模式、快速切換頁面的下拉式選單等。

◎以上程式範例AspNet46.aspx,如在頁框下不能操作,請開新視窗操作

    Protected Sub Page_Load(sender As Object, e As System.EventArgs) Handles Me.Load
        '本範例改寫自MSDN
        'GridView.PageIndexChanging 事件
        'http://msdn.microsoft.com/zh-tw/library/system.web.ui.webcontrols.gridview.pageindexchanging(v=vs.100).aspx
        'GridView.PageIndexChanged 事件
        'http://msdn.microsoft.com/zh-tw/library/system.web.ui.webcontrols.gridview.pageindexchanged
        'GridView.PageCount 屬性
        'http://msdn.microsoft.com/zh-tw/library/system.web.ui.webcontrols.gridview.pagecount(v=vs.100).aspx

        ' 底下有設置JavaScript,若不清空 label1裡的文字,按下取消時(頁面重整一次),又會跳出alert視窗
        Me.Label1.Text = ""
    End Sub

    Protected Sub DropDownList1_SelectedIndexChanged(sender As Object, e As System.EventArgs) Handles DropDownList1.SelectedIndexChanged
        ' 底下示範的只是換頁的呈現模式有哪些
        Select Case Me.DropDownList1.SelectedValue
            Case "上一頁下一頁"
                Me.GridView1.PagerSettings.Mode = PagerButtons.NextPrevious
            Case "首頁上一頁下一頁末頁"
                Me.GridView1.PagerSettings.Mode = PagerButtons.NextPreviousFirstLast
            Case "數字分頁"
                Me.GridView1.PagerSettings.Mode = PagerButtons.Numeric
            Case "首頁數字分頁末頁"
                Me.GridView1.PagerSettings.Mode = PagerButtons.NumericFirstLast
            Case Else
        End Select
    End Sub

    Protected Sub GridView1_PageIndexChanging(sender As Object, e As System.Web.UI.WebControls.GridViewPageEventArgs) Handles GridView1.PageIndexChanging
        ' 如果GridView的有開啟編輯狀態的話 (也就是有編輯列的索引值)
        ' 沒有索引值的話,就是-1,其他的索引都>=0
        If Me.GridView1.EditIndex <> -1 Then
            ' 這邊的e是指GridViewPageEventArgs,參數裡的cancel意思就是取消換頁
            e.Cancel = True
            ' 用label可以帶html碼的特性,偷渡一個JavaScript的警告視窗
            Me.Label1.Text = "<script type='text/javascript'>alert('請取消編輯模式再切換到第" & e.NewPageIndex + 1 & "頁')</script>"
        End If
    End Sub

    Protected Sub GridView1_RowUpdating(sender As Object, e As System.Web.UI.WebControls.GridViewUpdateEventArgs) Handles GridView1.RowUpdating
        Me.Label1.Text = "<script type='text/javascript'>alert('抱歉,demo網頁,不能讓您更新資料')</script>"
        ' 這邊的e是指GridViewUpdateEventArgs,參數資料中的cancel意思就是取消編輯
        ' 因為是demo範例,所以把編輯功能給關掉
        e.Cancel = True
        Me.GridView1.EditIndex = -1
    End Sub

    Protected Sub GridView1_DataBound(sender As Object, e As System.EventArgs) Handles GridView1.DataBound
        '每次GridView的資料繫結完畢後,頁面重整的影響下,DropDownList也被迫重新做一次的for迴圈…
        '所以每次GridView DataBind 結束,先把DropDownList這個容器裡的子項目給全部清除
        '不清除會有二個後果 1、子項目會愈來愈多(每次重整頁面,就會再加一次迴圈內的項目)  
        '                   2、底下有設定預設選取,下一次換頁就會出現錯誤訊息「不可以在 DropDownList 中選取多個項目」
        Me.DropDownList2.Items.Clear()

        '下面是在產生DropDownList上的頁數
        'PageCount是在GridView資料綁定後才可以算得出來的,所以寫在GridView1.DataBound事件中
        For i As Integer = 1 To CInt(Me.GridView1.PageCount.ToString)
            Dim item As New ListItem(i)
            '如果i=目前的頁面索引+1
            If i = Me.GridView1.PageIndex + 1 Then
                'Listitem(i) 就被選取
                item.Selected = True
            End If
            Me.DropDownList2.Items.Add(item)
        Next
    End Sub
    Protected Sub DropDownList2_SelectedIndexChanged(sender As Object, e As System.EventArgs) Handles DropDownList2.SelectedIndexChanged
        ' 設定依照下拉選單的頁數來換頁
        ' 例如當DropDownList下拉第3頁時,索引值是2
        ' 那GridView的換頁索引=2,也就是第3頁
        ' 這邊也是要避免編輯模式下換頁設計了if判斷句
        If Me.GridView1.EditIndex <> -1 Then
            Me.Label1.Text = "<script type='text/javascript'>alert('請取消編輯模式再切換到第" & Me.DropDownList2.SelectedIndex + 1 & "頁')</script>"
            Me.DropDownList2.SelectedIndex = Me.GridView1.PageIndex
        Else
            Me.GridView1.PageIndex = Me.DropDownList2.SelectedIndex
        End If
    End Sub

程式的內容說明大致上都補充到程式碼上頭了。
重點是「e 參數在每個事件中所參用的資料是不同的」
還有「要了解事件引發的順序」
如果有要研究的話,在下面二篇文章都有補充,請參考
自行撰寫GridView的RowCommand處理常式
GridView和分頁(paging)有關的事件


It’s my life live love …

異想天開幫4歲的女兒、6歲的兒子買海賊王的300片拼圖,搞沒二下就變成大人在拼,後來還是買20片、40片的給他們玩了…

兒子玩拼圖,別的不選,就愛有一堆公主的圖案
兒子玩拼圖,別的不選,就愛有一堆公主的圖案

女兒玩拼圖,別的不行只負責弄亂
女兒玩拼圖,別的不行只負責弄亂

沒有留言:

張貼留言

Related Posts Plugin for WordPress, Blogger...
// Dnow Function