循环控制和使用函数

时间:2013-11-20 19:24:52

标签: c# winforms oop

我有很多PanelsLabelsPictureBox,我有一个我使用的功能,就像这样 myFunction(panel1,label2,pictureBox3);我必须用这行代码编写大约40行...

我想知道是否有办法让函数循环遍历我需要的所有元素......就像...... while(i==40){myFunction(panel[i],label[i],pictureBox[i]); i++;}

3 个答案:

答案 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提出的组,这是一个好主意。