VB(Visual Basic)如何对动态生成的命令按钮添加鼠标事件

我已经动态生成很多按钮,可是无法对其添加事件。大家有什么好办法?请赐教。除了标的分外,根据大家提供答案的完善程序再追加分。最高200分。背景介绍:我准备编个座位信息表。通... 我已经动态生成很多按钮,可是无法对其添加事件。大家有什么好办法?请赐教。除了标的分外,根据大家提供答案的完善程序再追加分。最高200分。

背景介绍:
我准备编个座位信息表。
通过数据库中几行几列获得最大行数和列数,再动态生成命令按钮,每个命令按钮对应一个人。点这个命令按钮可以显示这个人详细信息。
我现在已经可以用循环语句生成这些按钮,可是实在没有办法对其添加事件。

我希望点了这个动态按钮之后,比如是第二排第三个,则数据库中,坐在我们公司第二排第三个的人相关信息就会在新窗口就出现。

我已经完成的代码如下,请大家帮我把鼠标单击事件添加上去。
Private Sub Form_Activate()
Dim tim As Integer
Dim db As Database
Dim rs As Recordset
Dim sql As String
Dim test As String
Set db = OpenDatabase(App.Path & "\SEPH Info-97.mdb")
sql = "select * from pc_info"
Set rs = db.OpenRecordset(" select max(column) from PC_Info ")
Text1.Text = rs.Fields(0)
column1 = rs.Fields(0)
Set rs = db.OpenRecordset(" select max(row) from PC_Info ")
Text2.Text = rs.Fields(0)
row1 = rs.Fields(0)
Dim cmdn As String

For n = 1 To row1

For i = 1 To column1
cmdn = Str(n) & Str(i)
Print Val(cmdn)
Load cmd(Val(cmdn))
cmd(Val(cmdn)).Caption = "My CMD"
cmd(Val(cmdn)).Width = 500
cmd(Val(cmdn)).Left = i * 1000 + 500
cmd(Val(cmdn)).Top = n * 1000 + 1500
cmd(Val(cmdn)).Visible = True

Next i
现在要想为动态按钮添加的事件就是:
点击之后弹出一个窗口,显示数据库中其它字段。
展开
 我来答
qingdaofu644
2008-12-21 · TA获得超过106个赞
知道小有建树答主
回答量:132
采纳率:0%
帮助的人:152万
展开全部
Option Explicit

Public ZWH As Integer '座位号
Dim column1 As Integer '列
Dim row1 As Integer '行

Private Sub cmd_Click(Index As Integer) '在按钮的单击事件中显示新窗体(个人详细信息)
'Index——按钮索引,你可以将其当作是座位编号
Dim Row As Integer '行号
Dim Col As Integer '列号

'取得座位的行号和列号,座位编号为Index
Row = Split(cmd(Index).Tag, ",")(0) 'Split()函数的使用我就不帮你解释了,呵呵!
Col = Split(cmd(Index).Tag, ",")(1)
ZWH = Index '座位号

'下面你就可以自由发挥了,如你要显示窗体Form2,则代码如下
Form2.Show '在Form2中你可以根据座位编号查找和显示对应个人详细信息了,你可以设置一个公共变量ZWH存储座位号,然后根据座位号进行数据库信息查找
End Sub

Private Sub Form_Load() '应该将你的加载动态按钮的过程放在Load事件中而不是Activate事件中,否则容易出错
Dim tim As Integer
Dim db As Database
Dim rs As Recordset
Dim sql As String
Dim test As String
Dim i As Integer
Dim n As Integer
Dim cmdn As Integer '用来存储命令按钮的下标序号(直接定义为整型变量,而不是字符型变量)

Set db = OpenDatabase(App.Path & "\SEPH Info-97.mdb")
sql = "select * from pc_info"
Set rs = db.OpenRecordset(" select max(column) from PC_Info ")
Text1.Text = rs.Fields(0)
column1 = rs.Fields(0)
Set rs = db.OpenRecordset(" select max(row) from PC_Info ")
Text2.Text = rs.Fields(0)
row1 = rs.Fields(0)

cmdn = 0

For n = 1 To row1
For i = 1 To column1
cmdn = cmdn + 1 '不要用cmdn = Str(n) & Str(i)这种方法存储下标,不然当你要通过下标来判断是点击了哪个按钮(座位)时很麻烦的,有可能会出现冲突的(比如第1行第12列的cmdn=112;而第11行的第2列的cmdn=112)

Print cmdn

Load cmd(cmdn) '加载按钮

With cmd(cmdn) '设置按钮的有关属性值
.Caption = "My CMD"
.Tag = n & "," & i '存储行号n与列号i,行与列之间用逗号(“,”)分开,方便识别是第几行与第几列
.Width = 500
.Left = i * 1000 + 500
.Top = n * 1000 + 1500
.Visible = True
End With
Next i
Next n
End Sub

注意:使用以上代码的前提是在窗体中将命令按钮cmd(也就是你的座位号)的Index属性设为0,且其属性Visible=Flase(不可见)

不知道我的代码你是否看得明白不?
56...7@qq.com
2008-12-21 · TA获得超过883个赞
知道小有建树答主
回答量:533
采纳率:0%
帮助的人:635万
展开全部
要用Load加载控件前,先确认一点,你在设计时先是否有设置cmd按钮为数组控件Index=0,然后再用Load cmd(Val(cmdn))?

如果所言一样,那就简单了,所有cmd(数组)的事件用法就和正常的控件一样,只是在事件中多了一个Index索引号,如:

假设共生成了10个cmd,Index就是每个cmd的索引号:

Private Sub cmd_Click(Index As Integer)
Select Case Index
Case 0 '设计时设置的初始值(第一个cmd)
'这里是第一个cmd的Click事件代码
'点击之后弹出一个窗口,显示数据库中其它字段。
MsgBox "这是第一个人的数据", vbInformation, "信息"
Case 1 '下面的都是由 Load 生成的索引数组值(第二个cmd)
MsgBox "这是第二个人的数据", vbInformation, "信息"
Case 2 '......
Case 3 '......
Case 4 '......
Case 5 '......
Case 6 '......
Case 7 '......
Case 8 '......
Case 9 '......
End Select
End Sub

同理,以下的其它cmd(数组)事件也一样,如:

Private Sub cmd_GotFocus(Index As Integer)

End Sub

Private Sub cmd_KeyDown(Index As Integer, KeyCode As Integer, Shift As Integer)

End Sub

Private Sub cmd_KeyPress(Index As Integer, KeyAscii As Integer)

End Sub

Private Sub cmd_KeyUp(Index As Integer, KeyCode As Integer, Shift As Integer)

End Sub

Private Sub cmd_LostFocus(Index As Integer)

End Sub

Private Sub cmd_MouseDown(Index As Integer, Button As Integer, Shift As Integer, X As Single, Y As Single)

End Sub

Private Sub cmd_MouseMove(Index As Integer, Button As Integer, Shift As Integer, X As Single, Y As Single)

End Sub

Private Sub cmd_MouseUp(Index As Integer, Button As Integer, Shift As Integer, X As Single, Y As Single)

End Sub

另外,建议在 cmd(Val(cmdn)).Visible = True 之后多加一行:

cmd(Val(cmdn)).ZOrder

主要是防止其它控件置前在生成的cmd上。

我曾编写过一个管理系统也是用CommandButton动态生成座位号按钮的,呵呵。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式