注册 登录
编程论坛 VB.NET论坛

自动动态添加控件

yuk_yu 发布于 2016-07-06 11:41, 9319 次点击
我有一个数据库有若干条记录(<100条),我希望将数据读取出来,按实际的数据条目数添加Label,能实现动态自动的增减,并很均匀分布在Form上。 最好所有label可以跟form大小变化大小。我的目的是可以实现目视化显示数据


基本效果如同编写计算器自动生成按钮一样,我不太会实现换行和自动分布!请大家指点

[此贴子已经被作者于2016-7-7 16:52编辑过]

11 回复
#2
yuk_yu2016-07-06 16:03
回复 楼主 yuk_yu
Dim Label() As Object
 Private Sub Form_Load()
 Dim i As Integer
 Dim nTop As Long
 
 ReDim Text(1 To 10)
 For i = 1 To 10
 Set Label(i) = Controls.Add("VB.Label", "Label" & CStr(i))
 Label(i).Height = 300
 Label(i).Top = nTop
 Label(i).Visible = True
 nTop = nTop + 30 * 15
 Next i
 
 End Sub
 

VB6可以,怎么实现?

问题主要是换行问题

[此贴子已经被作者于2016-7-6 17:01编辑过]

#3
yuk_yu2016-07-07 16:31
回复 2楼 yuk_yu
群里怎么没有人愿意指点下的,再次请求大家帮帮忙!!
#4
不说也罢2016-07-08 16:58
简单写了一个例子,你参考下吧:
程序代码:

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Dim i As Integer
        Dim nTop As Long = 0, nLeft As Long = 0
        Dim Label(0 To 9) As Label
        For i = 0 To 9
            Label(i) = New Label
            Controls.Add(Label(i))
            With Label(i)
                .Left += nLeft
                .Height = 30
                .Top = nTop
                .BorderStyle = BorderStyle.FixedSingle
                .Visible = True
                .Text = "Label" & i
                nLeft += .Width + 10
                If nLeft + .Width >= Me.Width Then
                    nLeft = 0
                    nTop = nTop + 30 * 2
                End If
            End With
        Next i
    End Sub


[此贴子已经被作者于2016-7-8 17:00编辑过]

#5
yuk_yu2016-07-08 23:34
谢谢版主,我试试看!
#6
yuk_yu2016-07-09 11:44
回复 4楼 不说也罢
版主,如果有更多的话怎么才能增加第三列呢?谢谢
#7
不说也罢2016-07-10 09:03
回复 6楼 yuk_yu
我也是醉了。
程序代码:


    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Me.WindowState = FormWindowState.Maximized
        Dim i As Integer, num As Integer
        Dim nTop As Long = 0, nLeft As Long = 0
100:
        Try
            num = InputBox("请输入要加载的Lable数量")
        Catch ex As Exception
            MsgBox("请输入一个合法的整数")
            GoTo 100
        End Try

        Dim Label(0 To num - 1) As Label
        For i = 0 To num - 1
            Label(i) = New Label
            Controls.Add(Label(i))
            With Label(i)
                .Left += nLeft
                .Height = 30'将标签的高度设为30
                .Top = nTop
                .BorderStyle = BorderStyle.FixedSingle
                .TextAlign = ContentAlignment.MiddleCenter '设置文字居中对齐
                .Visible = True
                .Text = "Label" & i
                nLeft += .Width + 10'将标签的左右间距设为10
                If nLeft + .Width >= Me.Width Then '如果下一个Label将超出窗体的宽度,换行显示
                    nLeft = 0
                    nTop = nTop + .Height +15'将标签的行间距设为15
                End If
            End With
        Next i
    End Sub

#8
yuk_yu2016-07-10 11:32
回复 7楼 不说也罢
谢谢版主!!
#9
不说也罢2016-07-10 19:49
以下是引用yuk_yu在2016-7-10 11:32:40的发言:

谢谢版主!!

不客气啊,你贴子数量还可以,且有专家分,欢迎一起探讨,共同进步。
今晚正好闲来无事,对上面的代码也作了一点儿优化。顺便也为你这个任意添加的Label添加上单击事件的代码。如果有用就拿去吧。
程序代码:

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Me.WindowState = FormWindowState.Maximized
        Dim i, num As Integer
        Dim nTop As Long = 0, nLeft As Long = 0
100:
        Try
            num = InputBox("请输入要加载的Lable数量")
        Catch ex As Exception
            MsgBox("请输入一个合法的整数")
            GoTo 100
        End Try

        Dim Label(0 To num - 1) As Label '根据输入的指定数值定义Label对象

        For i = 0 To num - 1
            Application.DoEvents()'设置程序友好响应
            Label(i) = New Label
            Controls.Add(Label(i))
            With Label(i)
                .SetBounds(nLeft, nTop, 60, 30) '将标签的高度设为30,宽度设为60
                .BorderStyle = BorderStyle.FixedSingle
                .TextAlign = ContentAlignment.MiddleCenter '设置文字居中对齐
                .Text = "Label" & i
                .Tag = i '这个属性用来识别每个Label对象
                .Visible = True
                AddHandler Label(i).Click, AddressOf LabelClick '将刚创建的标签关联上单击事件
                '为即将创建的下一个标签设置坐标
                nLeft += .Width + 10 '将标签的左右间距设为10
                If nLeft + .Width >= Me.Width Then '如果下一个Label将超出窗体的宽度,换行显示
                    nLeft = 0
                    nTop += .Height + 15 '将标签的行间距设为15
                End If
            End With
        Next i
    End Sub

    Private Sub LabelClick(ByVal sender As System.Object, ByVal e As System.EventArgs) '自定义一个过程,用来响应各个标签对象的单击事件
        MsgBox("你点击了Label" & sender.Tag)
        Select Case sender.Tag
            Case 0 To 20
                sender.ForeColor = Color.Blue
            Case 21 To 40
                sender.ForeColor = Color.Red
            Case Else
                sender.ForeColor = Color.White
        End Select
        sender.Text = "我被点中了"
    End Sub

#10
yuk_yu2016-07-11 08:58
回复 9楼 不说也罢
谢谢版主!!!
#11
梦幻倩影2016-08-31 11:45
版主:请问为何您通过代码新建的Label 可以引用下标,Label(i).text; 而我在表单窗口中通过控件拖进来的标签确不能引用 Label(i).text ;而只能通过me.controls("label"&i).text 引用

两种方式建的标签有何不同呢?
         
#12
不说也罢2016-09-01 08:51
窗体中的拖进来的label都是一个独立的对象,包含在me.controls的集合中,而我在前面贴子中是另外定义了一个label对象的集合。这与以前的VB6是有不同的。


1