Office中国论坛/Access中国论坛
标题:
众里寻他千百度——遍历其它窗体上的控件
[打印本页]
作者:
roych
时间:
2019-7-31 10:12
标题:
众里寻他千百度——遍历其它窗体上的控件
一直很好奇,为什么有人想要遍历窗体上所有控件。一般情况下,个人觉得这是一个伪需求。例如,做权限设计的话,根本没必要遍历控件,毕竟窗体上实现权限控制粒度细分无非若干个按钮,在录入界面上,文本框、标签的个数往往是远远超过按钮数。就那么几个按钮,手动建表输入不行吗?
再如,刚刚发现论坛里有人提及,动态引用窗体控件以赋值。当然,这个版友大概是忘记打开窗体了,结果报错。
其实早前有人在群里问及这个事情,便写了一个模块发到群里了。不过,既然再次有版友提及,那么倒不如做个示例,供大家参考吧。正如诗云:“众里寻他千百度,蓦然回首,那人却在程序报错处”。
按惯例先上代码:
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控件,必然会报错。其他则不再赘述。有问题的地方请回复本帖。
[attach]63419[/attach]
作者:
admin
时间:
2019-7-31 10:57
赞!!
作者:
tmtony
时间:
2019-7-31 21:56
好示例,赞!
作者:
ynjxw
时间:
2019-8-1 09:10
附件已损坏?麻烦重新上传一下,谢谢!
作者:
roych
时间:
2019-8-6 09:58
ynjxw 发表于 2019-8-1 09:10
附件已损坏?麻烦重新上传一下,谢谢!
没毛病啊。可能是你的系统问题。
[attach]63422[/attach]
作者:
access新新新手
时间:
2019-8-28 08:55
allforms返回的竟然不是forms集合,而是AcceObject)问题就在这里
欢迎光临 Office中国论坛/Access中国论坛 (http://www.office-cn.net/)
Powered by Discuz! X3.3