Dim rst As New ADODB.Recordset
Dim i, j As Integer
i = 0
Set rst = DE1.Data.Execute("select * from GongziKemu")
If rst.RecordCount > 0 Then
   ReDim Text(rst.RecordCount)
   ReDim Lab(rst.RecordCount)
   ReDim Pic(rst.RecordCount)
   
   rst.MoveFirst
   While rst.EOF = False
   Set Lab(Trim(rst(0))) = Controls.add("VB.label", "" & Trim(rst(1)) & Trim(rst(0)) & "", Me)
    With Lab(Trim(rst(0)))‘Trim(rst(0)))从数据库读取出来是1,2,3...的整数
    .Top = 240 + i
    .Left = 1900
    .Width = 800
    .Height = 375
    .Visible = True
    .Alignment = vbCenter
    .Caption = "" & Trim(rst(1)) & ""
    End With
    
    Set Text(Trim(rst(0))) = Controls.add("VB.textbox", "Text" & Trim(rst(0)) & "", Me)
    With Text(Trim(rst(0)))
        .Top = 240 + i
        .Left = Lab(Trim(rst(0))).Left + Lab(Trim(rst(0))).Width
        .Width = 2475
        .Height = 285
        .Visible = True
        .Alignment = vbCenter
        .Text = "Text" & Trim(rst(0)) & ""
    End With
     i = i + 400
   rst.MoveNext
  Wend
End If上面是根据数据库里的字段动态的生成n个text和label,定义的是数组类型。 代码可以正常运行生成n个控件,但是之后定义不了它们的事件。生成控件的名称应该是set后的名字吧,所以每个控件的名字为Text(1),Text(2),....。然后定义它们的事件应该这样写吧:Dim WithEvents Text(1) As VB.TextBox。但是vb不支持这个带括号的命名。用不带括号的命名也试过,可以正常的定义事件。但是这里是动态的生成几个控件,不能事先命名,必须用数组来定义。不知道各位有什么其它的好方法吗。

解决方案 »

  1.   

    用数组的话,可以先在窗体上放一个控件,设置其index属性为0,隐藏它,然后用:
    load 控件名(索引)
    的方法,来来代替程序中的controls.add语句,这样,就可以处理事件了
      

  2.   

    Option ExplicitDim WithEvents Ev_CommandButton As VB.CommandButtonPrivate Sub Ev_CommandButton_Click()
            MsgBox Ev_CommandButton.Name
    End SubPrivate Sub Form_Load()
           Timer1.Interval = 100
    End SubPrivate Sub Timer1_Timer()
           Set Ev_CommandButton = Me.ActiveControl
    End Sub
      

  3.   

    另外,不想使用load方法做的话,可以看这个程序:
    http://www.mvps.org/emorcillo/download/vb6/grl_event2.zip
      

  4.   

    Timer1.Interval = 50 --一般人的点击没有这么快.
      

  5.   

    根本原因是Controls.add设计的不完善一般情况下用控件数组,可以一起处理事件实在不行的话用CreateWindowEx创建控件子窗口,再发消息控制,给父窗口挂子类处理通知消息以处理事件