我想知道,是否有可能通过它的号码访问pictureBox。之前我问了一个类似的问题,得到了一个很好的答案,但它是关于textBoxes的,似乎它对于pictureBoxes不起作用。以下是textBoxes的工作原理:
this.Controls["textBox" + i.ToString()].Text = allProducts;
我可以在类似的事情中访问pictureBox [i]吗?谢谢。
编辑:对于那些提出textBox帖子的人,我已经提到了同样的方法对于pictureBox不起作用。答案 0 :(得分:1)
您没有按号码访问文本框。您正在通过他们的名称访问它们,这恰好包含一个数字。您可以对任何UI控件执行相同操作,包括PictureBox控件,如果其名称在末尾包含数字。
您已有工作代码。只需更改名称即可。
例如
this.Controls["textBox" + i.ToString()].Text = allProducts;
也可能是
this.Controls["pictureBox" + i.ToString()].Text = allProducts;
甚至
this.Controls["MyKeshaThemedCustomControl" + i.ToString()].Text = allProducts;
您的代码不是特定于类型的。只要它继承自Windows.Forms.Controls.Control,它就可以与任何控件一起使用。它们都具有Text属性,因此您的代码甚至是类型安全的!这里唯一限制你的是你的命名惯例,以及你坚持下去的能力。
如果您需要访问某些特定于PictureBox的属性(例如Image),您可以执行以下操作:
var p = this.Controls["pictureBox" + i.ToString()].Text as PictureBox;
if (p == null) throw new IndexOutOfRangeException("Late binding is a B*!");
p.Image = GetImage();
如果您非常确定自己永远不会出现i
错误(或者如果您不关心凌乱的异常),可以将其缩短为
((PictureBox)this.Controls["pictureBox" + i.ToString()]).Image = GetImage();
答案 1 :(得分:0)
以下代码将以类型安全的方式执行您想要的操作
var myPicBox = this.Controls.OfType<PictureBox>().FirstOrDefault(e => e.Name == "pictureBox" + i.ToString());
它会遍历所有控件并过滤掉图片框,然后找到一个带索引的结尾。如果失败,您将获得null。您可以修改代码以使用许多其他类型的控件。例如,如果您要查找文本框,那将是..
var myTextBox = this.Controls.OfType<TextBox>().FirstOrDefault(e => e.Name == "textBox" + i.ToString());