Access交流中心

北京 | 上海 | 天津 | 重庆 | 广州 | 深圳 | 珠海 | 汕头 | 佛山 | 中山 | 东莞 | 南京 | 苏州 | 无锡 | 常州 | 南通 | 扬州 | 徐州 | 杭州 | 温州 | 宁波 | 台州 | 福州 | 厦门 | 泉州 | 龙岩 | 合肥 | 芜湖 | 成都 | 遂宁 | 长沙 | 株洲 | 湘潭 | 武汉 | 南昌 | 济南 | 青岛 | 烟台 | 潍坊 | 淄博 | 济宁 | 太原 | 郑州 | 石家庄 | 保定 | 唐山 | 西安 | 大连 | 沈阳 | 长春 | 昆明 | 兰州 | 哈尔滨 | 佳木斯 | 南宁 | 桂林 | 海口 | 贵阳 | 西宁 | 乌鲁木齐 | 包头 |

VBA动态添加控件

zichie  发表于:2014-05-12 14:48:54  
复制

大家好,有个问题想请教下。

我有一个表,表中有个字段是用来表示不确定数量的内容。所以我用了","将内容隔开。比如这个字段名  【更换配件】, 有两条记录,一条是“电阻,电容,二极管”,另一条是“电容,三极管”

 

我的想法是动态创建文本框来显示其内容,如果这个字段中有两个数据那么就显示两个文本框,有3个就显示3个文本框。

百度了下,知道ACCESS不能在窗体模式下添加控件,所以我就用了子窗体,先打开子窗体的设计视图,然后根据数量创建对应文本框,创建文本框实现后发现我做不了将字段中的数据在文本框中显示。所以请大家帮帮忙,谢谢了。

 

原先代码如下:

Dim ctl As Control
Dim intX As Integer
Dim intY As Integer

Dim Tbox As ControlDim CXQ() As String
Dim CGHPJ() As String
Dim CPJXH() As String
Dim CPJSL() As String
Dim CPJBZ() As String
CGHPJ = Split(Me.GHPJ, ",")
CXQ = Split(Me.X_Q, ",")
CPJXH = Split(Me.PJXH, ",")
CPJSL = Split(Me.PJSL, ",")
CPJBZ = Split(Me.PJBZ, ",")

'打开子窗体设计模式
DoCmd.OpenForm "childchangespa", acDesign
'删除所有文本框
For Each ctl In Forms!childchangespa
 If ctl.ControlType = acTextBox Then
 DeleteControl "childchangespa", ctl.Name
 End If
Next ctl

'动态添加窗体

intY = 390
intX = 0
For i = 1 To UBound(CGHPJ) + 1
Set Tbox = CreateControl("childchangespa", acTextBox, , "", "", intX, intY, 386, 384)
intY = intY + 390
Next i


'关闭并保存子窗体
DoCmd.Close acForm, "childchangespa", acSaveYes

Me.Child24.SourceObject = "childchangespa"

 

 

Top
蟹仔 发表于:2014-05-12 14:51:12
你把全部文本框都加上,到时候根据条件把不用的控件隐藏掉不就得了?

zichie 发表于:2014-05-12 14:55:54
关键字段内的内容是不确定数量的啊,就算把所有空间都画出来,我还是不能让一个控件对应显示一个值啊

蟹仔 发表于:2014-05-13 10:45:49

先假设你最大可能出现的数量,你觉得有20个就搞20个控件,你觉得有100个就搞100个,你觉得有1000个就弄1000个。有什么难的。

http://www.accessoft.com/article-show.asp?id=8451

这是我做过的一个例子,想显示多少列就显示多少列,不显示的就隐藏掉。



zichie 发表于:2014-05-14 13:10:44

你好,先谢谢你的回答。你的这个实例是非常好的解决了实时改变控件数量的问题。但是对于我来说不是太实用,我可以使用这个方法来得到对应数量的控件。但是没办法给控件绑定数据。其实就是我不懂怎么重一个带“,”分割的字段中将各子字段提取出来再绑定到控件上,但是我知道这种办法是可以实现的,所以我才来问。

还有你知道怎么让控件的名字作为一个变量吗?如果这个能解决我也能实现上面的问题了。

简单阐述下,

dim ctl as control

dim ctlMC as string

for each ctl in me

if ctl.controltype = actextbox then

ctlMC= ctl.name

end if

next ctl

到这里我怎么才能使用这个ctlMC里储存的控件名称来实行对应的方法呢?



一杯绿茶 发表于:2014-05-14 15:29:08
在access中估计有点恼火

zichie 发表于:2014-05-14 16:59:41

是啊,access为什么就没有控件的INDEX属性呢?



叶海峰 发表于:2014-05-14 17:28:09

dim a 

dim i

a=split(字段,"," )

for i = 0 to ubound(a)-1

me.controls("textbox"&i)=a(i)

me.controls("textbox"& & i).visible=true

next

文本框控件命名以序号结尾,从0开始.



蟹仔 发表于:2014-05-14 19:39:43

你提出的”让控件的名字作为一个变量“,

其实这有点转牛角尖了。正如楼上所说的。其实控件的名字没变。依然是text0,text1,text2,text3........等等,唯一变的就是他的赋值。

其实我给的那个例子精髓就在那个储存列标题的那个表,虽然以123456789来命名,但具体他的列标题与内容却是可变的。

其实编程并不需要什么高深的技术,有时候几简单的控件+一些简单的代码,就可以实现你觉得access无法完成的内容,有时候你觉得access已经无法实现你需要的功能时,不妨倒回来想,你为什么要实现这个功能,这个功能的最终效果是什么?有没有别的办法?

这样,一段时间后,你会发现原来以前写的代码有多烂。



hongyin 发表于:2014-05-15 08:17:36

“其实就是我不懂怎么重一个带“,”分割的字段中将各子字段提取出来再绑定到控件上”


可以参考“【Access小品】继往开来--用正则表达式提取信息示例

http://www.accessoft.com/article-show.asp?id=8030



zichie 发表于:2014-05-15 08:50:20

楼上是在帮我纠正错别字呢?还是看不懂我这句话的意思?不好意思,打错了一个“从”。

谢谢“蟹仔”的热心支持,我和你的想法一样,以前我写一些冗长的代码,等我发现更简单的方法去实现的时候才发现前面的代码有多烂,你的动态显示控件的数量我已经采纳了,是比我写的那个好,但是我的问题是不会将值从字段中提取出来再绑定到控件上。“叶海峰”这位大哥的方法正是我需要的,由于基础不好我都不知道controls能这样用,谢谢了。我这就去试试。



总记录:10篇  页次:1/1 9 1 :