VBA窗體之ListView分頁顯示


實現功能如下:

1、指定每頁顯示記錄:CmbRecNum_Change 

 

 

代碼如下:

Option Explicit

Dim cnn As ADODB.Connection     '聲名數據庫連接對象變量
Dim rst As ADODB.Recordset      '聲名記錄集對象變量
Dim rstDS As ADODB.Recordset    '聲名記錄集對象變量
Dim rsPage As Integer           '用於記錄當前處於第幾頁

'窗體加載時,完成數據庫的連接,設置顯示每頁的記錄數
Private Sub UserForm_Initialize()
    
    Dim i As Integer
    For i = 1 To 20
        CmbRecNum.AddItem i
    Next
    CmbRecNum.ListWidth = 50
    CmbRecNum.ColumnWidths = 35
    CmbRecNum.Value = 5         '默認一頁有 5 條記錄
    rsPage = 1                 '默認第一頁
    
    '建立數據庫的連接
    Set cnn = New ADODB.Connection  '創建連接對象
    cnn_open cnn
    
    '查詢表中數據生成記錄集
    Dim sql As String
    sql = "select * from 員工 order by 編號 asc"
    Set rst = New ADODB.Recordset
    rst.Open sql, cnn, adOpenKeyset, adLockOptimistic
    
    '生成 ListView 控件的基本框架結構
    With ListView1
        .ColumnHeaders.Clear    '清除表頭
        .ListItems.Clear        '清除記錄
        .View = lvwReport       '設置顯示方式為"報表形式"
        .FullRowSelect = True   '允許選中整行
        .Gridlines = True       '顯示網格線
        
        For i = 0 To rst.Fields.Count - 1
            '顯示標題,設置標題寬度
            Select Case True
            Case i = 0
                .ColumnHeaders.Add , , rst.Fields(i).Name, 50
            Case i = 2
                .ColumnHeaders.Add , , rst.Fields(i).Name, 100, lvwColumnCenter
            Case InStr("8,9", i)
                .ColumnHeaders.Add , , rst.Fields(i).Name, 130
            Case Else
                .ColumnHeaders.Add , , rst.Fields(i).Name, 50, lvwColumnCenter
            End Select
        Next
    End With
    AddRows rsPage
    
End Sub

'自定義過程,用於調整 ListView 控件上顯示當前頁的數據
Public Sub AddRows(myPage As Integer)
    On Error Resume Next
    Dim i As Integer, j As Integer
    '創建局部 Recordset 對象 rstDB ,保存 rst 記錄集中當前頁的記錄數據
    Set rstDS = New ADODB.Recordset
    For i = 0 To rst.Fields.Count - 1
        'Append:追加字段
        rstDS.Fields.Append rst.Fields(i).Name, rst.Fields(i).Type, rst.Fields(i).DefinedSize
    Next
    rstDS.Open  '打開局部 Recordset 對象 rstDS
    
    'PageSize:表示記錄集每頁的記錄條數
    rst.PageSize = Val(CmbRecNum.Value)     '重置 rst 每頁的記錄條數
    rst.AbsolutePage = myPage               '重置 rst 的當前記錄頁
    
    '將 rst 當前頁的記錄保存到 rstDS 中
    For i = 1 To rst.PageSize
        rstDS.AddNew        '添加 1 條記錄
        For j = 0 To rst.Fields.Count - 1
            rstDS.Fields(j).Value = rst.Fields(j).Value
        Next
        If rst.EOF Then Exit For
        rst.MoveNext        '繼續賦值
    Next
    
    '在 ListView 控件中顯示當前頁的記錄數據
    rstDS.MoveFirst     '定位 rstDS 中的第一條記錄
    With ListView1
        .ListItems.Clear
        For i = 1 To rstDS.RecordCount
            .ListItems.Add , , rstDS.Fields(0).Value     '添加第1列內容
            For j = 1 To rstDS.Fields.Count - 1
                .ListItems(i).SubItems(j) = rstDS.Fields(j).Value   '添加后續列內容
            Next
            If rstDS.EOF Then Exit For
            rstDS.MoveNext      '繼續賦值
        Next
        
    End With
    
    txtPage.Value = myPage & "/" & rst.PageCount
    
End Sub

Sub cnn_open(cnn)
    With cnn
        .Provider = "microsoft.ace.oledb.12.0"
        .ConnectionString = "data source=" & ThisWorkbook.Path & "\學生管理.accdb"
        .Open
    End With
End Sub

Private Sub btnFirst_Click()
    rsPage = 1
    AddRows rsPage
End Sub

Private Sub btnBefore_Click()
    If rsPage <> 1 Then
        rsPage = rsPage - 1
        AddRows rsPage
    End If
End Sub

Private Sub btnNext_Click()
    If rsPage <> rst.PageCount Then
        rsPage = rsPage + 1
        AddRows rsPage
    End If
    
End Sub

Private Sub btnLast_Click()
    rsPage = rst.PageCount
    AddRows rsPage
End Sub

Private Sub btnClose_Click()
    rst.Close
    cnn.Close
    Set rst = Nothing
    Set cnn = Nothing
    Set rstDS = Nothing
    Unload Me
End Sub

'組合框Change事件,當改變組合框的值,重新刷新窗體上的記錄顯示
Private Sub CmbRecNum_Change()
   rsPage = 1
   AddRows rsPage
End Sub

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM