动态添加控件问题

hnwl0507 2008-10-30 05:04:40
我动态添加了一些控件,然后在执行的过程中我双想支动态添加好的控件的一些属性进行修改,这样该如何实现呢?
比如说吧:
我在窗体的Load事件中动态的添加了一个Picturebox控件并指定好的它的image属性,但在程序的运行过程中当发生某个事时我要去更改此Picturebox的image属性,这该如何做呢?
我也想到了在添加时指定它的Name属性,然后更改时用name属性来指引,可是动态添加的,在你写更改image属性的事件时它会提示不存在这个picturebox控件.
那位高手是否遇到,该如何处理呢?
给个思路吧
...全文
173 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
pjagz 2008-10-31
  • 打赏
  • 举报
回复
For Each Item As Object In Me.Controls
'改进一吓,须在创建控件时给控件命名。如: pcx.Name = "Name"
If TypeOf Item Is PictureBox And Item.Name = "Name" Then
Dim pcx As PictureBox = CType(Item, PictureBox)

Stop
End If
Next
pjagz 2008-10-31
  • 打赏
  • 举报
回复
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

For Each Item As Object In Me.Controls
If TypeOf Item Is PictureBox Then
Dim pcx As PictureBox = CType(Item, PictureBox)
Stop
End If
Next

End Sub
hnwl0507 2008-10-31
  • 打赏
  • 举报
回复
5楼的说法是不对的,是动态添加多少那样我试过只能添加一个.

而7楼所说的方法可能实现,但当窗体中的控件过多时,那么循环次数不是就太多了?
新的开始 2008-10-30
  • 打赏
  • 举报
回复
楼主的问题很简单
——定义的动态控件变量放错了位置
应该从SUB里面放到外面
这样其他的事件里也就可以访问它了
netdragon2 2008-10-30
  • 打赏
  • 举报
回复
Public Class PBoxItem
Private mArray() As NewPBox
Private mCount As Integer

' 定义一个公用构造函数来初始化字段
Public Sub New()
Me.mCount = 0
End Sub


' 定义一个只读属性来返回已经有的NewPBox的个数
Public ReadOnly Property Count() As Integer
Get
Return Me.mCount
End Get
End Property
' 定义一个属性来返回PBox
Public Property items(ByVal k As Integer) As NewPBox
Get
Return Me.mArray(k)
End Get
Set(ByVal value As NewPBox)
Me.mArray(k) = value
End Set
End Property







'加入一个NewPBox 算是指定一个NewPBox 创建NewPBox还是要自己写的
Public Sub add(ByVal aNewPBox As NewPBox)
ReDim Preserve Me.mArray(mCount)
mArray(mCount) = aNewPBox
mCount += 1
End Sub
' 删除一个NewPBox
Public Sub Remove(ByVal i As Integer)
Dim j As Integer
If i + 1 > Me.mCount Or i < 0 Then
MsgBox("超出索引值!")
Else
If i + 1 = Me.mCount Then
Me.mArray(mCount - 1) = Nothing
Else
For j = i + 1 To Me.mCount - 1
Me.mArray(j - 1) = Me.mArray(j)
Next j
Me.mArray(mCount - 1) = Nothing
End If
Me.mCount -= 1
ReDim Preserve mArray(mCount - 1)
End If
End Sub
' 定义一个公用方法:删除所有的NewPBox
Public Sub Clear()
For i = 0 To Me.Count - 1
Me.Remove(0)
Next
ReDim mArray(-1)
mCount = 0
End Sub
End Class


这是我写程序时自己写的一个类,用来放置我加到Form1里的多个newPBox(这个是继承PictureBox的一个类,因为我要Picturebox多几个属性供自己使用)
请把上面代码中的 as newPBox 换成 as picturebox
然后就在Form1里面
Public Class Form1
Public mypboxitem As New PBoxItem
......
'这是一个按钮的点击事件
Private Sub YaDi_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles YaDi.Click
dim newpicturebox as new picturebox
newpicturebox.属性 = XXXXXXX
mypboxitem.add(newpicturebox)
'这个按钮点了几次,mypboxitem里就有几个picturebox
'其它代码使用时用:mypboxitem.items(i).属性 这个i就你第(i+1)个加到Form1里的Picturebox
End Sub

hnwl0507 2008-10-30
  • 打赏
  • 举报
回复
我是动态添加控件数组的
采用的方法是:
Public m_pic As New ArrayList
Dim pic As New PictureBox
pic.Location = New Point(x, y)
pic.Size = New Size(45, 10)
pic.Image = Image.FromFile(Application.StartupPath & "\picture\S-D-Z.gif")
pic.SizeMode = PictureBoxSizeMode.StretchImage
me.Controls.Add(pic)
m_pic.Add(pic)
CloneCenter 2008-10-30
  • 打赏
  • 举报
回复
1 楼的方法动态创建没有问题。引用控件,直接用这个 MyPicture 就可以了,不要使用 Name 属性,这个 Name 只是在设计截断有用处。

另外,如果想对控件的事件做出响应,可以使用 AddHandler 来添加事件处理函数。
AddHandler MyPicture.Click, AddressOf Button1_Click

类似上面的这种写法。
blues_zhao_yang 2008-10-30
  • 打赏
  • 举报
回复

Public Class Form1

Dim MyPicture As New PictureBox

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Controls.Add(MyPicture)
MyPicture.Location = New Point(10, 10)
End Sub

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
MyPicture.ImageLocation = "D:\素材\图标\tool.ico"
End Sub
End Class

16,553

社区成员

发帖
与我相关
我的任务
社区描述
VB技术相关讨论,主要为经典vb,即VB6.0
社区管理员
  • VB.NET
  • 水哥阿乐
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧