【问题标题】:Using a foreach loop with pictureboxes使用带有图片框的 foreach 循环
【发布时间】:2018-11-20 01:03:16
【问题描述】:

我正在尝试使我的代码尽可能短,并且我打算以一定的间隔从 6 张图片中为 3 个不同的图片框随机选择图片。我没有为每个图片框复制和粘贴开关和大小写三次,而是尝试在一个 foreach 循环中进行更改。我对 C# 和 windows 窗体非常陌生,因此不胜感激。 编辑:很抱歉措辞不佳,但问题是程序说元素不是有效的图片框,我想知道为什么以及如果可能的话如何修复它,但感谢替代解决方案。

private void timer1_Tick(object sender, EventArgs e)
    {

        Random random = new Random();
        int picture = random.Next(1, 7);
        var pictures = new List<PictureBox> { pictureBox1, pictureBox2, pictureBox2 };
        foreach (PictureBox element in pictures)
        {
            switch (picture)
            {
                case 1:
                    this.element.Image = Image.FromFile("C:\\Users\\seanb\\OneDrive\\Pictures\\cherry.jpg");
                    break;
                case 2:
                    this.element.Image = Image.FromFile("C:\\Users\\seanb\\OneDrive\\Pictures\\bell.jpg");
                    break;
                case 3:
                    this.element.Image = Image.FromFile("C:\\Users\\seanb\\OneDrive\\Pictures\\lemon.jpg");
                    break;
                case 4:
                    this.element.Image = Image.FromFile("C:\\Users\\seanb\\OneDrive\\Pictures\\orange.jpg");
                    break;
                case 5:
                    this.element.Image = Image.FromFile("C:\\Users\\seanb\\OneDrive\\Pictures\\star.jpg");
                    break;
                case 6:
                    this.element.Image = Image.FromFile("C:\\Users\\seanb\\OneDrive\\Pictures\\skull.jpg");
                    break;
            }
        }

【问题讨论】:

  • 你的问题到底是什么?

标签: c# image winforms foreach picturebox


【解决方案1】:

像这样使用Dictionary 怎么样:

Dictionary<int, Image> dictionary = new Dictionary<int, Image>()
{
    {1,  Image.FromFile("C:\\Users\\seanb\\OneDrive\\Pictures\\cherry.jpg")},
    {2,  Image.FromFile("C:\\Users\\seanb\\OneDrive\\Pictures\\bell.jpg")},
};

dictionary.TryGetValue(picture, out value);
if (value != null)
{
    this.element.Image = value;
}

【讨论】:

    【解决方案2】:

    所以你有图片:

    static Image[] s_Images = new string[] {
         "cherry.jpg",
         "bell.jpg",
         "lemon.jpg", 
         "orange.jpg",
         "star.jpg", 
         "skull.jpg"}
      .Select(file => Path.Combine(@"C:\Users\seanb\OneDrive\Pictures", file))
      .Select(file => Image.FromFile(file)) 
      .ToArray();  
    
    static Random random = new Random();
    

    并且您想将这些图像随机分配给图片框:

    private void timer1_Tick(object sender, EventArgs e) {
      foreach (PictureBox box in new PictureBox[] { pictureBox1, pictureBox2, pictureBox2 }) {
        box.Image = s_Images[random.Next(s_Images.Length)];
      }
    }
    

    【讨论】:

      【解决方案3】:
      Random random = new Random();
      int picture = random.Next(1, 7);
      var pictureBoxs = new List<PictureBox> { pictureBox1, pictureBox2, pictureBox2 };
      string basePath = "C:\\Users\\seanb\\OneDrive\\Pictures\\";
      string[] pictures = new string[]{ "cherry.jpg", "bell.jpg", "lemon.jpg", "orange.jpg", "star.jpg", "skull.jpg" };
      foreach (PictureBox element in pictureBoxs)
      {
          this.element.Image = Image.FromFile(basePath+ pictures[picture]);
      }
      

      【讨论】:

        【解决方案4】:

        使用Dictionary 接近

        int picture = new Random().Next(1, 7);
        Dictionary<int, string> dictionary = new Dictionary<int, string>()
        {
            {1, "cherry.jpg"},
            {2, "bell.jpg"},
            {3, "lemon.jpg"},
            {4, "orange.jpg"},
            {5, "star.jpg"},
            {6, "skull.jpg"}
        };
        string res = "default.jpg";
        var pictures = new List<PictureBox> { pictureBox1, pictureBox2, pictureBox2 };
        string path = System.IO.Path.Combine("C:\\Users\\seanb\\OneDrive\\Pictures\\" + dictionary.TryGetValue(picture, out res));
        pictures.ForEach(x => x.Image = Image.FromFile(path));
        

        【讨论】:

          【解决方案5】:
          private void timer1_Tick(object sender, EventArgs e)
                  {
                      Random random = new Random();
                      List<string> picPaths = new List<string>();
                      picPaths.Add("C:\\Users\\seanb\\OneDrive\\Pictures\\cherry.jpg");
                      picPaths.Add("C:\\Users\\seanb\\OneDrive\\Pictures\\bell.jpg");
                      picPaths.Add("C:\\Users\\seanb\\OneDrive\\Pictures\\lemon.jpg");
                      picPaths.Add("C:\\Users\\seanb\\OneDrive\\Pictures\\orange.jpg");
                      picPaths.Add("C:\\Users\\seanb\\OneDrive\\Pictures\\star.jpg");
                      picPaths.Add("C:\\Users\\seanb\\OneDrive\\Pictures\\skull.jpg");
          
                      pictureBox1.Image = Image.FromFile(picPaths[random.Next(picPaths.Count)]);
                      pictureBox2.Image = Image.FromFile(picPaths[random.Next(picPaths.Count)]);
                      pictureBox3.Image = Image.FromFile(picPaths[random.Next(picPaths.Count)]);
                  }
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2016-12-09
            • 2017-03-25
            • 1970-01-01
            • 2015-06-16
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多