VB.NET使用DataGridView分頁顯示

 在使用DataGridView顯示來自DataTable的記錄時,如果DataTable裏的記錄太多(上百條),那麼用DataGridView查看記錄就很不方便,如果能讓DataGridView分頁顯示,每頁只顯示10條(可以隨意規定每頁顯示的條數),並且配以頁面之間的跳轉按鈕,豈不是方面了許多?現在就來說說我是怎麼做到的吧。

我自己編寫了一個類用於輔助DataGridView控件的記錄分頁顯示,並提供頁面跳轉的方法。下面是這個類的源代碼:

http://download1.csdn.net/down3/20070610/10102852142.vb

Public Class ClsDataGridViewPage

    '每頁記錄數
    Private _RowsPerPage As Integer
    '總頁數
    Private _TotalPage As Integer
    '當前頁數
    Private _curPage As Integer = 0
    '要分頁的DataGridView
    Private _DataGridView As Windows.Forms.DataGridView
    '與需要分頁顯示的的DataView
    Private _dv As DataView

    '獲取與設置每頁記錄數
    Public Property RowsPerPage() As Integer
        Get
            Return _RowsPerPage
        End Get
        Set(ByVal value As Integer)
            _RowsPerPage = value
        End Set
    End Property

    '獲取總頁數
    Public ReadOnly Property TotalPage() As Integer
        Get
            Return _TotalPage
        End Get
    End Property

    '獲取與設置當前頁數
    Public Property curPage() As Integer
        Get
            Return _curPage
        End Get
        Set(ByVal value As Integer)
            _curPage = value
        End Set
    End Property

    '設置需要分頁的GetDataGridView
    Public WriteOnly Property SetDataGridView()
        Set(ByVal value As Object)
            _DataGridView = value
        End Set
    End Property

    '設置需要分頁顯示的的DataView
    Public WriteOnly Property SetDataView()
        Set(ByVal value As Object)
            _dv = value
        End Set
    End Property

    Public Sub New()

    End Sub

    '重載NEW函數,在構造時就可以對成員賦值
    Public Sub New(ByVal datagridview As Windows.Forms.DataGridView, ByVal dv As DataView, _
    ByVal RowsPerPage As Integer)
        _DataGridView = datagridview
        _dv = dv
        _RowsPerPage = RowsPerPage
    End Sub

    '開始分頁啦
    Public Sub Paging()
        '首先判斷DataView中的記錄數是否足夠形成多頁,
        '如果不能,那麼就只有一頁,且DataGridView需要顯示的記錄等同於“最後一頁”的記錄
        If _dv.Count <= _RowsPerPage Then
            _TotalPage = 1
            GoLastPage()
            Exit Sub
        End If

        '可以分爲多頁的話就要計算總的頁數咯,然後DataGridView顯示第一頁
        If _dv.Count Mod _RowsPerPage = 0 Then
            _TotalPage = Int(_dv.Count / _RowsPerPage)
        Else
            _TotalPage = Int(_dv.Count / _RowsPerPage) + 1
        End If
        GoFirstPage()
    End Sub

    '到第一頁
    Public Sub GoFirstPage()
        '如果只有一頁,那麼顯示的記錄等同於“最後一頁”的記錄
        If _TotalPage = 1 Then
            GoLastPage()
            Exit Sub
        End If
        '如果有多頁,就到第“1”頁
        _curPage = 0
        GoNoPage(_curPage)
    End Sub

    Public Sub GoNextPage()
        '這段代碼主要是爲了防止當前頁號溢出
        _curPage += 1
        If _curPage > _TotalPage - 1 Then
            _curPage = _TotalPage - 1
            Exit Sub
        End If

        '如果到了最後一頁,那就顯示最後一頁的記錄
        If _curPage = _TotalPage - 1 Then
            GoLastPage()
            Exit Sub
        End If

        '如果沒到最後一頁,就到指定的“下一頁”
        GoNoPage(_curPage)
    End Sub

    Public Sub GoPrevPage()
        '防止不合法的當前頁號
        _curPage -= 1
        If _curPage < 0 Then
            _curPage = 0
            Exit Sub
        End If

        '到指定的“上一頁”
        GoNoPage(_curPage)
    End Sub

    '到最後一頁
    Public Sub GoLastPage()
        _curPage = _TotalPage - 1
        Dim i As Integer
        Dim dt As New DataTable
        'dt只是個臨時的DataTable,用來獲取所需頁數的記錄
        dt = _dv.ToTable.Clone

        For i = (_TotalPage - 1) * _RowsPerPage To _dv.Count - 1
            'i值上下限很關鍵,調試的時候常常這裏報錯找不到行
            '就是因爲i值溢出
            Dim dr As DataRow = dt.NewRow
            dr.ItemArray = _dv.ToTable.Rows(i).ItemArray
            dt.Rows.Add(dr)
        Next
        _DataGridView.DataSource = dt
    End Sub

    '到指定的頁
    Public Sub GoNoPage(ByVal PageNo As Integer)
        _curPage = PageNo
        '防止不合法的頁號
        If _curPage < 0 Then
            MsgBox("頁號不能小於1")
            Exit Sub
        End If

        '防止頁號溢出
        If _curPage >= _TotalPage Then
            MsgBox("頁號超出上限")
            Exit Sub
        End If

        '如果頁號是最後一頁,就顯示最後一頁
        If _curPage = _TotalPage - 1 Then
            GoLastPage()
            Exit Sub
        End If

        '不是最後一頁,那顯示指定頁號的頁
        Dim dt As New DataTable
        dt = _dv.ToTable.Clone
        Dim i As Integer
        For i = PageNo * _RowsPerPage To (PageNo + 1) * _RowsPerPage - 1
            Dim dr As DataRow = dt.NewRow
            dr.ItemArray = _dv.ToTable.Rows(i).ItemArray
            dt.Rows.Add(dr)
        Next
        _DataGridView.DataSource = dt
    End Sub
End Class

現在舉例介紹一下怎麼使用這個類(以下簡稱分頁輔助類)來幫助DataGridView控件分頁顯示記錄:

首先,在DataGridView所在的窗體類代碼中加入該分頁輔助類的成員:

Private dgvPage As ClsDataGridViewPage

然後在窗體的構造函數代碼中實例化這個成員:

Public Sub New()

        ' 此調用是 Windows 窗體設計器所必需的。
        InitializeComponent()

        ' 在 InitializeComponent() 調用之後添加任何初始化。

        '實例化分頁類成員
        dgvPage = New ClsDataGridViewPage '分頁類成員
    End Sub

注意:要想讓DataGridView分頁顯示記錄,最關鍵的需要設置的分頁類的三個屬性是:
SetDataGridView 該屬性用於設置窗體上要分頁顯示記錄的DataGridView控件
RowsPerPage 該屬性用來設置每頁需要顯示的記錄數
SetDataView 該屬性用來設置需要在DataGridView空間上顯示的DataView
可以靈活地設置這三個屬性,以滿足不同的DataGridView對不同的DataView進行指定每頁記錄數的顯示(是不是很方便?)現在舉例如何設置這三個屬性:

        '設置分頁類對象的屬性
        dgvPage.GetDataGridView = Me.DataGridView1 '需要分頁的是 Me.DataGridView1
        dgvPage.RowsPerPage = 10 '每頁顯示10條記錄

        '獲取需要分頁顯示的DataView
        Dim dt As DataTable = Me.DataGridView1.DataSource
        dgvPage.SetDataView = dt.DefaultView

上述屬性設置的過程要在DataGridView第一次設置DataSource時進行。(因爲實現分頁類實現DataGridView的分頁顯示是通過改變DataGridView的DataSource屬性實現的。當然,可以在任何時候將想要在DataGridView中分頁顯示的DataView賦給dgvPage.SetDataView ,比如:

dim dv as new DataView=......
dgvPage.SetDataView = dv

這樣DataGridView裏顯示的記錄可以動態地變化。)

剩下的事就簡單啦:要實現DataGridView的記錄分頁顯示,調用分頁類的Paging 方法,
要看第一頁,調用分頁類的GoFirstPage方法
要看下一頁,調用 GoNextPage方法
要看前一頁,調用GoPrevPage方法
要看最後一頁,調用GoLastPage方法
要看指定頁號的頁,調用 GoNoPage方法

只要靈活使用好了這個類,你的DataGridView控件的分頁功能絕不成問題。而且隨時都能瞭解當前到了第幾頁(curPage()+1),一共有多少頁(TotalPage())

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章