我有很多Panels
,Labels
和PictureBox
,我有一个我使用的功能,就像这样
myFunction(panel1,label2,pictureBox3);
我必须用这行代码编写大约40行...
我想知道是否有办法让函数循环遍历我需要的所有元素......就像......
while(i==40){myFunction(panel[i],label[i],pictureBox[i]); i++;}
答案 0 :(得分:2)
这个怎么样:
for (i = 0; i < 40; i++)
{
var panel = this.Controls
.OfType<Panel>()
.First(p => p.Name == string.Format("panel{0}"))
var label = this.Controls
.OfType<Label>()
.First(p => p.Name == string.Format("label{0}"));
var panel = this.Controls
.OfType<PictureBox>()
.First(p => p.Name == string.Format("pictureBox{0}"));
myFunction(panel, label, pictureBox);
}
答案 1 :(得分:2)
您可以遍历表单和容器控件的Controls
集合。但是你要遇到的问题是如何正确地将一个与其他人联系起来。如果它们总是在这三个组中,那么循环遍历所有控件似乎无法确定每个控件属于哪个直观分组。
即使它确实如此,也不是我想要依赖的东西。
相反,您可以在表单级别跟踪此“分组”。它可以像自定义对象一样简单,如下所示:
class PanelPictureGroup
{
public Panel GroupPanel { get; set; }
public Label GroupLabel { get; set; }
public PictureBox GroupPictureBox { get; set; }
}
对象本身不执行任何操作,但您可以在表单加载时初始化它们的集合。类似的东西:
private List<PanelPictureGroup> myGroups = new List<PanelPictureGroup>();
并在加载事件中,或在表单中的某处:
myGroups.Add(new PanelPictureGroup { GroupPanel = panel1, GroupLabel = label2, GroupPictureBox = pictureBox3 });
myGroups.Add(new PanelPictureGroup { GroupPanel = panel4, GroupLabel = label5, GroupPictureBox = pictureBox6 });
// and so on, probably abstracted into a form initialization method and called once on form load
此时,所有控件实际上都在逻辑组中,显式设置为这样。 (而不是试图根据控制“数字”的假设来推断这些组,这些假设完全是任意的。)现在循环遍历它们是微不足道的:
foreach (var myGroup in myGroups)
myFunction(myGroup.GroupPanel, myGroup.GroupLabel, myGroup.GroupPictureBox);
可以封装到对象中的逻辑越多越好。正如Eric Raymond曾经说过的那样,“智能数据结构和愚蠢的代码比其他方式更好。”
答案 2 :(得分:1)
可以使用Controls.Find()使用以下代码检查所有这些控件的名称:
Panel pnl;
Label lbl;
PictureBox pb;
Control[] matches;
for(int i = 1; i <= 40; i = i + 3)
{
matches = this.Controls.Find("panel" + i.ToString(), true);
if (matches.Length > 0 && matches[0] is Panel)
{
pnl = matches[0] as Panel;
matches = this.Controls.Find("label" + (i + 1).ToString(), true);
if (matches.Length > 0 && matches[0] is Label)
{
lbl = matches[0] as Label;
matches = this.Controls.Find("pictureBox" + (i + 2).ToString(), true);
if (matches.Length > 0 && matches[0] is PictureBox)
{
pb = matches[0] as PictureBox;
myFunction(pnl, lbl, pb);
}
}
}
}
你可以在Form的Load()事件中使用这样的代码来填充David提出的组,这是一个好主意。