|
一直很好奇,为什么有人想要遍历窗体上所有控件。一般情况下,个人觉得这是一个伪需求。例如,做权限设计的话,根本没必要遍历控件,毕竟窗体上实现权限控制粒度细分无非若干个按钮,在录入界面上,文本框、标签的个数往往是远远超过按钮数。就那么几个按钮,手动建表输入不行吗?
再如,刚刚发现论坛里有人提及,动态引用窗体控件以赋值。当然,这个版友大概是忘记打开窗体了,结果报错。
其实早前有人在群里问及这个事情,便写了一个模块发到群里了。不过,既然再次有版友提及,那么倒不如做个示例,供大家参考吧。正如诗云:“众里寻他千百度,蓦然回首,那人却在程序报错处”。
按惯例先上代码:
- Private Sub Command0_Click()
- Dim frm As Form
- Dim strData As String
- Dim accObj As AccessObject
- Dim ctl As Control
-
- For Each accObj In CurrentProject.AllForms
- DoCmd.OpenForm accObj.Name
- Set frm = CurrentProject.AllForms.Application.Forms(accObj.Name)
- If frm.Name <> Me.Name Then
- frm.Visible = False
- For Each ctl In frm.Controls
- strData = ctl.Name & "," & strData
- Next
- Me.txtTest.Value = Me.txtTest.Value & frm.Name & ":" & Left(strData, Len(strData) - 1) & vbCrLf
- strData = ""
- DoCmd.Close acForm, frm.Name
- End If
- Next
- End Sub
复制代码 代码很简单,所以就不再注释了。大体是先定义好AcceObject控件(这也是一个很奇怪的东西,allforms返回的竟然不是forms集合,而是AcceObject),然后将AcceObject传递给form对象,最后打开form,遍历里面的控件,读取控件名,赋值给当前文本框并输出。
需要注意的是,一定要加上If frm.Name <> Me.Name Then这部分。这是因为打开窗体时,Me应该是当前激活的窗体,如果没有这一句,那么在当前激活的窗体里找不到Me.txtTest控件,必然会报错。其他则不再赘述。有问题的地方请回复本帖。
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?注册
x
评分
-
查看全部评分
|