Access开发培训
网站公告
·Access专家课堂QQ群号:151711184    ·Access快速开发平台下载地址及教程    ·欢迎加入Access专家课堂微信群!    ·如何快速搜索本站文章|示例|资料    
您的位置: 首页 > 技术文章 > Access数据库-模块/函数/VBA

组合框RowSourceType之自定义函数

时 间:2013-12-16 22:18:38
作 者:Aaron   ID:20267  城市:闵行
摘 要:大家都知道组合框与列表框的数据源类型有:表/查询、字段列表、数值列表。其实还有一个类型,那就是用户自定义函数类型。
正 文:

大家都知道组合框与列表框的数据源类型有:表/查询、字段列表、数值列表。其实还有一个类型,那就是用户自定义函数类型。

看下面的窗体:

组合框与列表框与平时没有两样,但是秘密在于:

它们的RowSourceType是用户自定义的函数,并且RowSource为空。

在窗体的加载事件中可以看到:

红圈中的就是用户自定义的函数。

函数建立在一个模块当中是一个公共的函数。这个函数可不是随便写的,是有一定的格式的。

Function functionname(fld As Control, id As Variant, row AsVariant, col As Variant, code As Variant) As Variant


这个函数有5个参数:

  1. fld代表组合框或者列表框控件
  2. id 代表被填充的控件的唯一标识符,当在一个窗体中用此一个函数填充多个组合框与列表框时尤其重要
  3. row 要填充的行数
  4. col要填充的列数
  5. code内在的常量,用来控制函数的执行过程

这个函数要自动地被执行多次来完成对组合框或列表框的数据填充。

先看一下这个函数的例子代码:

Dim mrstContact As DAO.Recordset, mintRow As Integer '//模块级变量

'//用户自定义函数

Public Function ListMDBs(fld As Control, id As Variant, _
                         row As Variant, col As Variant, _
                         code As Variant) As Variant
    Dim ReturnVal As Variant
    ReturnVal = Null

    Select Case code
    Case acLBInitialize                ' Initialize.
        Set mrstContact = CurrentDb.OpenRecordset("Select 姓氏,名字   FROM 联系人")
        ReturnVal = mrstContact.RecordCount
    Case acLBOpen                        ' Open.
        ReturnVal = Timer
    Case acLBGetRowCount            ' Get number of rows.
        With mrstContact
            .MoveLast
            .MoveFirst
            ReturnVal = .RecordCount
        End With
    Case acLBGetColumnCount    ' Get number of columns.
        ReturnVal = 2
    Case acLBGetColumnWidth    ' Column width.
        ReturnVal = -1
    Case acLBGetValue
        ' Get data.
        With mrstContact
            .MoveFirst
            .Move row
            ReturnVal = .Fields(col)
        End With
    Case acLBEnd
        MsgBox "The End"
    End Select

    ListMDBs = ReturnVal

End Function


这个函数是如何运行的呢?

code的各种情况按照下图中所示进行执行。只有最后一个是要一直不断的执行的,比如,每当你点击下拉箭头,展开组合框时,或在列表框的行间移动时。

在只执行一次的case分支中,用来对整个控件进行初始化操作。包括数据源、行数、列数。

请注意,由于此函数会不断重复的运行,所以数据源要么采用全局变量要么采用静态变量。如果采用普通的函数内局部变量,每次执行的时候就会被覆盖,这样数据源就会错误。

函数使用的关键一点是如何正确的填充数据。

在GetValue分支中,函数的参数row与col决定数据填充的位置,此时要根据这两个参数将数据源中正确的数据传递出来。即建立如下的函数关系:

Data=FDataSource(row,col)



附件是英文原版的解释:

点击下载此文件



Access软件网官方交流QQ群 (群号:483923997)       Access源码网店

常见问答:

技术分类:

相关资源:

专栏作家

关于我们 | 服务条款 | 在线投稿 | 友情链接 | 网站统计 | 网站帮助