如何使用循环无重复代码将多张图片加载到PictureBox控件中
你当前的核心问题是:拼接得到的pbSpineNum是字符串类型的控件名称,不是实际的PictureBox控件实例,自然无法直接访问Image属性,以下是两种可直接落地的实现方案:
方案1:通过窗体的Controls集合查找对应名称的控件
不需要提前调整现有控件定义,直接在循环内按名称查找即可,修改后代码如下:
private void btnUse19_Click(object sender, EventArgs e) { string applicationDirectory = Application.ExecutablePath; //使用学号作为索引获取应用程序的文件路径 string editedApplicationDirectory = applicationDirectory.Substring(0, applicationDirectory.IndexOf("19001700")); // 提前拼接资源根路径,避免循环内重复计算,Path.Combine可自动适配路径分隔符避免出错 string resRootPath = Path.Combine(editedApplicationDirectory, "19001700", "Resources"); for (int i = 1; i <= 10; i++) { string pbName = "pbSpine" + i.ToString(); // 查找控件,第二个参数true表示递归查找子容器内的控件 PictureBox pb = Controls.Find(pbName, true).FirstOrDefault() as PictureBox; if (pb == null) continue; // 没找到对应控件直接跳过 string picPath = Path.Combine(resRootPath, $"Spine {i}.png"); pb.Image = Image.FromFile(picPath); } }
方案2:提前将PictureBox控件存入数组(运行效率更高)
如果控件数量固定,可在窗体初始化时一次性把对应PictureBox存入数组,循环时直接访问数组元素即可,不需要每次查找控件:
// 窗体类内先定义控件数组 private PictureBox[] spinePBs; private void Form1_Load(object sender, EventArgs e) { // 按顺序把对应控件存入数组,仅需要初始化一次 spinePBs = new PictureBox[] { pbSpine1, pbSpine2, pbSpine3, pbSpine4, pbSpine5, pbSpine6, pbSpine7, pbSpine8, pbSpine9, pbSpine10 }; } private void btnUse19_Click(object sender, EventArgs e) { string applicationDirectory = Application.ExecutablePath; string editedApplicationDirectory = applicationDirectory.Substring(0, applicationDirectory.IndexOf("19001700")); string resRootPath = Path.Combine(editedApplicationDirectory, "19001700", "Resources"); for (int i = 0; i < spinePBs.Length; i++) { string picPath = Path.Combine(resRootPath, $"Spine {i+1}.png"); spinePBs[i].Image = Image.FromFile(picPath); } }
内容的提问来源于stack exchange,提问作者Kyle Warren
相关产品推荐
相关产品推荐

