【问题标题】:Group 64 picture boxes into picturebox array将 64 个图片框组合成图片框数组
【发布时间】:2015-07-07 17:50:58
【问题描述】:

我使用 GUI 创建了 64 个图片框。现在我想将这些图片框组合成一个图片框数组,因为我需要它不断更新所述图片框中的图片。

我有以下代码:

private PictureBox[] pictureBoxArray= new PictureBox[64]; //Initialize array to group picture boxes into picture box array

  private void Main_Load(object sender, EventArgs e)
    {
        ConvertGuiPBtoGuiPbArray(ref pictureBoxArray);
    }

public static void ConvertGuiPBtoGuiPbArray(ref PictureBox[] pictureBoxArray)
    {
        foreach(PictureBox index in pictureBoxArray)
        {
        //Some code to do the following:
        pictureBoxArray[0]=pictureBox1; //this is the name of the pictureBox on the GUI
        pictureBoxArray[1]=pictureBox2;
        pictureBoxArray[2]=pictureBox3;
        .
        .
        .
        pictureBoxArray[63]=pictureBox64;

       //

    }

我见过 Controls.ofType 的命令,但我似乎不明白。任何建议将不胜感激。我在这里先向您的帮助表示感谢!

【问题讨论】:

  • 为什么会出现在 foreach 语句中?
  • 因为我必须遍历整个数组(?)(只是一个建议,欢迎任何更改)
  • 我还是不明白你的问题,你想要更好的方式来编写你的代码还是你想用你的代码做其他事情?
  • 另外,您的参数不需要 ref,数组是一个类,默认为 ref

标签: c# arrays winforms picturebox


【解决方案1】:

假设您坚持使用表单的设计和 64 个单独的 pictureBoxNN 属性,基本反射可以根据需要填充数组。我不认为Controls 可以保证有正确的排序。

for (int i = 0; i < 64; i++)
{
    pictureBoxArray[i] = (PictureBox)GetType().GetProperty("pictureBox" + (i + 1)).GetValue(this);
}

【讨论】:

    【解决方案2】:

    此代码将您表单的所有图片框添加到您的图片框数组

    private PictureBox[] pictureBoxArray;
    private void Main_Load(object sender, EventArgs e)
    {
         pictureBoxArray = this.Controls.OfType<PictureBox>().OrderBy(x => x.Name).ToArray();
    }
    

    “this”指的是Form,如果你想添加另一个容器的图片框,如groupboxany container “this”替换为容器名称

    如果您想按降序对它们进行排序,您可以使用 OrderByDescending 而不是 OrderBy

    完整的代码可以是这样的:

    private static PictureBox[] pictureBoxArray;
    
    public static void ConvertGuiPBtoGuiPbArray(ContainerControl container)
    {
        pictureBoxArray = container.Controls.OfType<PictureBox>().OrderBy(x => x.Name).ToArray();
    }
    private void Main_Load(object sender, EventArgs e)
    {
        ConvertGuiPBtoGuiPbArray(this);//Or Whatever container like groupbox
    }
    

    【讨论】:

      【解决方案3】:

      如果它们没有嵌套在其他控件中,而是直接放置在您的表单上,您可以这样做:

      PictureBox[] pictureBoxes = this.Controls.OfType<PictureBox>().ToArray();
      

      编辑:

      对于您的嵌套控件,您需要遍历所有控件容器并检查它们是否在其中包含 PictureBox。你可以这样做:

      private void Form_Shown(object sender, EventArgs e)
      {
          List<PictureBox> pictureBoxes = new List<PictureBox>();
          GetAllPictureBoxes(ref pictureBoxes, this.Controls);
      
          PictureBox[] pictureBoxesArray = pictureBoxes.OrderBy(pb => pb.Name).ToArray();
      }
      
      private void GetAllPictureBoxes(ref List<PictureBox> pictureBoxes, Control.ControlCollection controls)
      {
          foreach (Control control in controls)
          {
              if (control.HasChildren)
                  GetAllPictureBoxes(ref pictureBoxes, control.Controls);
      
              if (control is PictureBox)
                  pictureBoxes.Add((PictureBox)control);
          }
      }
      

      【讨论】:

        【解决方案4】:

        好吧,过了一段时间我开始使用以下方法:

        private PictureBox[] pictureBoxArray = new PictureBox[64]; //Initialize array to group picture boxes into picture box array
        
        private void Main_Load(object sender, EventArgs e)
            {
                ConvertGuiPBtoGuiPbArray(ref pictureBoxArray);
            }
        
        public void ConvertGuiPBtoGuiPbArray(ref PictureBox[] pictureBoxArray)
        {
                int i = 0;
                string NameofPictureBox;
                string PictureBoxNumber;
        
                foreach (var item in groupBox_DataLayer.Controls)
                {
                    if (item is PictureBox)
                    {
                        NameofPictureBox = ((PictureBox)item).Name;
                        PictureBoxNumber = Regex.Match(NameofPictureBox, @"\d+").Value; // \d+ is regex for integers only
                        i = Int32.Parse(PictureBoxNumber);  //Convert only number string to int
                        i = i - 1;  //bcs of index of array starts from 0-63, not 1-64
                        pictureBoxArray[i] = (PictureBox)item; //put PictureBox object in desired position
                    }
        
                }
        }
        

        这对我来说完全有效,我在排序时遇到了问题,但现在一切正常。谢谢大家的帮助!

        【讨论】:

          【解决方案5】:

          您可以使用 LinQ 查询来搜索具有特定名称的控件:

          public void ConvertGuiPBtoGuiPbArray(ref PictureBox[] pictureBoxArray)
          {
              for (int i = 0; i <= pictureBoxArray.Count() - 1; i++)
              {
                  int count = i;
                  pictureBoxArray[i] = (PictureBox)this.Controls.Cast<Control>().Where(c => c.Name.ToLower() == "picturebox" + (count + 1)).First();
              }
          }
          

          您基本上循环从 0 到 63 的 indizes 并搜索名称为“picturebox + (index+1)”的图片框并将其分配给数组中的此索引。

          如果源图片框未在 this.Controls 集合中排序,则会跳过问题。

          鉴于您对组框的评论:在这种情况下,图片框不是this.Controls 的一部分,您需要将查询替换为

          pictureBoxArray[i] = (PictureBox)groupboxName.Controls.Cast<Control>().Where(c => c.Name.ToLower() == "picturebox" + (count + 1)).First();
          

          【讨论】:

          • c => c 这是一个 lambda 表达式吗?
          • 是的。它是 LinQ 查询的一部分。在这种情况下,c 是 Controls 中与给定名称进行比较的当前元素。
          • 当我尝试从数组中打印项目的名称时,我仍然得到一个空引用异常。我已将其替换为组框的名称。
          • 同样 user2946329 方法 FIRST 方法有效,但 this.Controls 改为 groupBox_DataLayer.Controls。它有效,但名称不按顺序排列。也许我应该使用他的方法,然后对数组进行排序?
          • 很难说为什么会出现异常。我测试了这个方法,它很好地选择了图片框并将它们放在数组中。你到底从哪里得到异常?你确定你首先打电话给this.InitializeComponent() 来实际创建这些盒子吗?调用应该在表单的构造函数中。
          猜你喜欢
          • 1970-01-01
          • 2017-05-03
          • 2021-03-02
          • 2023-03-15
          • 1970-01-01
          • 2018-09-17
          • 2023-04-05
          • 2014-12-11
          • 1970-01-01
          相关资源
          最近更新 更多