【问题标题】:Looping through controls with similar names [duplicate]循环访问具有相似名称的控件[重复]
【发布时间】:2013-12-02 22:03:59
【问题描述】:

我有一个带有选项卡式控件(5 个选项卡)的表单,在一个选项卡上我有 10 个图片框,分别命名为 pic1、pic、pic3 等等。在 VBA 中,可以使用类似这样的方式循环访问控件:

 For i = 1 To 10
    Me.Controls("Img" & i).Picture = Me.cboProperty.Column(i)
 Next

目前有

 this.pic1.DataBindings.Add("ImageLocation", this.mainTableBindingSource, "localPic1");
 this.pic2.DataBindings.Add("ImageLocation", this.mainTableBindingSource, "localPic2");
 this.pic3.DataBindings.Add("ImageLocation", this.mainTableBindingSource, "localPic3");

直到 10 岁,但肯定有更好的方法吗?

【问题讨论】:

  • 该示例是 vb,但问题标记为 C#。你需要哪个?
  • 你可以将你所有的pics 放入一个数组中并循环遍历该数组
  • @Joel:问题是c#,我只是用VB部分来说明需求。

标签: c# winforms


【解决方案1】:

这样,不。通常,您会像这样访问一组控件:

foreach (var pictureBox in PictureTab.Controls.OfType(Of PictureBox)())
{
   pictureBox.Picture = //...
}

当然,这里的诀窍是没有索引,知道要查看哪一列。但这很容易解决:

int i = 0;
foreach (var pictureBox in PictureTab.Controls.OfType<PictureBox>())
{
   pictureBox.Picture = cboProperty.Column[i];
   i++;
}

根据您的编辑,您可能需要:

int i = 0;
foreach(var pictureBox in PictureTab.Controls.OfType<PictureBox>())
{
    picutreBox.DataBindings.Add("ImageLocation", mainTableBindingSource, string.Format("loalPic{0}", i));
    i++;
}

【讨论】:

  • ...不再是... :(
  • 乔尔,你当然是 100% 正确的。此代码完美运行!谢谢
【解决方案2】:

大概是这样的:

 var pictureBoxes = this.Controls.OfType<PictureBox>().ToList();
 for (int i = 0; i < pictureBoxes.Count; i++) {
     pictureBoxes[i].DataBindings.Add("ImageLocation", 
                                      this.mainTableBindingSource, 
                                      "localPic" + (i + 1).ToString());
 }

【讨论】:

    【解决方案3】:

    您可以在表单控件中搜索图片框的名称并循环增加每个的值,例如Pic1Pic2等。

    for (int a = 1; a <= 10; a++)
    {
        string name = "pic" + a;
        PictureBox pic = (PictureBox)(this.Controls.Find(name, true))[0];
        pic.DataBindings.Add("ImageLocation", this.mainTableBindingSource, "localPic3");
    }
    

    【讨论】:

    • 我想不止一种方法可行,但我选择了 Tijesunimi 简单而有效的方法。感谢您的所有帮助。
    • @Peter 可悲的是,Controls.Find() 是建议的最糟糕的方法。它速度较慢,并且依赖于魔法字符串。
    【解决方案4】:

    遍历所有表单控件

    List<Control> lstOfControls = new List<Contol>();
    public void AllPictureControls(Control control, bool enabled) 
    {
         foreach(Control child in control.Controls)
         {
             if(child.Name.StartsWith("pic"))
             {
                 lstOfControls.Add(control);
             }
         }
    }
    

    【讨论】:

    • 如果每个反对票都可以证明是合理的,那就太好了
    • 一个改变类级变量而不是返回数据的函数?这就是充分的理由。
    • 我这里没有返回任何数据
    • 您仍然可以调用该函数一次并将结果分配给类级变量,但更好的做法是给 GetControls() 函数起一个更好的名称,并让它创建并返回列表。
    【解决方案5】:

    将所有图片控件的引用放入数据结构中,例如一个数组,然后遍历它们。

    类似于:

    PictureBox[] picBoxArray = new PictureBox[50];
    
    // 50 iterations for 50 object instantiations.
    for (int i=0; i<picBoxArray.Length; i++) {
    
        // create an pictureBox instance.
        picBoxArray[i] = new PictureBox();
    
    }
    
    PictureBox pb = null;
    
    // 50 iterations for calling methods on each of the 50 objects.
    for (int i=0; i<picBoxArray.Length; i++) {
    
        pb = picBoxArray[i];
        // do something with the picturebox e.g. pb.SetPicture(...)
    
    }
    

    【讨论】:

    • 这个答案有什么问题?
    猜你喜欢
    • 2014-12-14
    • 1970-01-01
    • 1970-01-01
    • 2016-07-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-09
    • 2012-07-19
    相关资源
    最近更新 更多