VB.NET如何获取选中的动态生成PictureBox 通过按钮调整其尺寸等属性
实现方案
你只需要把当前选中的PictureBox实例存起来,三个按钮的点击事件里直接读取这个实例就能操作,有两种常用的实现方式:
方式1:用窗体成员变量存储(最简便)
- 先在你的窗体类内部的顶部声明一个私有成员变量,用来存储当前选中的PictureBox:
Public Class 你的窗体类名 ' 新增这一行,存储当前选中的图片框 Private _currentSelectedPic As PictureBox ' 原来的其他代码,比如CreateImages、_Click之类的都放在下面
- 修改你的
_Click事件代码,去掉冗余的循环比对逻辑(你已经通过sender拿到了被点击的PictureBox,不需要再循环找名字),直接给成员变量赋值:
Public Sub _Click(ByVal sender As Object, ByVal e As EventArgs) Dim pb As PictureBox = DirectCast(sender, PictureBox) ' 先把上一个选中的图片框背景色恢复为未选中状态 If _currentSelectedPic IsNot Nothing Then _currentSelectedPic.BackColor = Color.Green End If ' 存储当前选中的图片框 _currentSelectedPic = pb pb.BackColor = Color.Blue ' 标记为选中状态 ' 直接用当前pb的属性设置按钮位置,不需要循环 BtnAdd.Top = pb.Location.Y + 330 BtnAdd.Left = pb.Location.X BtnSub.Top = pb.Location.Y + 330 BtnSub.Left = pb.Location.X + 40 BtnNew.Top = pb.Location.Y + 330 BtnNew.Left = pb.Location.X + 80 Label1.Top = pb.Location.Y + 360 Label1.Left = pb.Location.X ' 提取图片编号:把Name里的Image前缀去掉转成数字即可 Dim picNo As Integer = Integer.Parse(pb.Name.Replace("Image", "").Trim()) Label1.Text = "Art. " & picNo txtArt.Top = pb.Location.Y + 380 txtArt.Left = pb.Location.X BtnAdd.Visible = True BtnSub.Visible = True BtnNew.Visible = True Label1.Visible = True txtArt.Visible = True pb.Refresh() End Sub
- 三个按钮的点击事件里直接使用
_currentSelectedPic操作即可,举个放大按钮的示例:
Private Sub BtnAdd_Click(sender As Object, e As EventArgs) Handles BtnAdd.Click ' 先判断有没有选中的图片框,避免空引用报错 If _currentSelectedPic Is Nothing Then Exit Sub ' 示例:宽度高度各放大10% _currentSelectedPic.Width = CInt(_currentSelectedPic.Width * 1.1) _currentSelectedPic.Height = CInt(_currentSelectedPic.Height * 1.1) End Sub
方式2:用按钮的Tag属性存储(不需要加全局变量)
如果你不想新增窗体成员变量,可以在_Click事件里给三个按钮的Tag属性赋值为当前选中的PictureBox,按钮点击时从自己的Tag里取即可:
- 在
_Click事件里新增三行赋值逻辑:
' 放在_click事件里给按钮设位置的代码附近即可 BtnAdd.Tag = pb BtnSub.Tag = pb BtnNew.Tag = pb
- 按钮点击事件里读取Tag:
Private Sub BtnAdd_Click(sender As Object, e As EventArgs) Handles BtnAdd.Click Dim btn As Button = DirectCast(sender, Button) Dim targetPic As PictureBox = TryCast(btn.Tag, PictureBox) If targetPic Is Nothing Then Exit Sub ' 操作targetPic即可,比如缩小 targetPic.Width = CInt(targetPic.Width * 0.9) targetPic.Height = CInt(targetPic.Height * 0.9) End Sub
原代码优化建议
- 你的
CreateImages方法里For i = 1 To i的写法可读性很差,建议先把输入的数量转成单独的变量:Dim picCount As Integer = CInt(TextBoxNumberImages.Text),再写For i = 1 To picCount - 拼接Name的时候不要用
Str(i),转出来的字符串前面会带空格,建议用pb.Name = "Image" & i.ToString(),避免后续名字比对出错
内容的提问来源于stack exchange,提问作者Mark2k
相关产品推荐
相关产品推荐

