如何引用运行时新建并添加的PictureBox控件?
运行时创建的PictureBox引用方法
直接使用this.pcb00这种方式不可行,因为这些PictureBox是运行时动态创建的,编译器在编译阶段无法识别这类未提前声明的控件名称,自然不能通过直接引用的方式访问。以下是几种实用的引用方案:
方法1:通过Controls.Find查找控件
利用窗体的Controls.Find方法,根据你设置的Name属性定位目标PictureBox:
// 查找名为pcb00的控件,第二个参数true表示递归查找所有子控件 var targetPcb = this.Controls.Find("pcb00", true).FirstOrDefault() as PictureBox; if (targetPcb != null) { targetPcb.BackColor = Color.Yellow; }
方法2:用集合统一存储动态控件
在窗体类中声明一个集合,创建PictureBox时就将其加入集合,后续直接通过集合索引或键值对快速查找:
// 窗体类级别字段 private Dictionary<string, PictureBox> _mapPictureBoxes = new Dictionary<string, PictureBox>(); // 创建控件的循环逻辑中 var pcb = new PictureBox(); pcb.Name = "pcb" + i + j; pcb.Margin = new Padding(0); pcb.Size = new Size(slotSize, slotSize); pcb.Location = new Point(i * slotSize, j * slotSize); // ...颜色设置逻辑 this.Controls.Add(pcb); // 将控件存入字典 _mapPictureBoxes.Add(pcb.Name, pcb); // 后续引用目标控件 if (_mapPictureBoxes.ContainsKey("pcb00")) { _mapPictureBoxes["pcb00"].BackColor = Color.Yellow; }
方法3:创建时直接保存特定控件引用
如果只需要引用某个固定位置的PictureBox,可以在创建时直接将其赋值给类级别变量:
// 窗体类级别字段 private PictureBox _pcb00; // 创建控件的循环逻辑中 var pcb = new PictureBox(); pcb.Name = "pcb" + i + j; // ...属性设置逻辑 this.Controls.Add(pcb); // 匹配到目标位置时保存引用 if (i == 0 && j == 0) { _pcb00 = pcb; } // 后续直接使用变量 if (_pcb00 != null) { _pcb00.BackColor = Color.Yellow; }
内容的提问来源于stack exchange,提问作者Spell Cin
相关产品推荐
相关产品推荐

