使用面板中的控件,仅编辑图片框控件

Work with Controls in panel, edit picturebox controls, only

面板 1 有多个图片框和标签。

我想制作一个按钮,它只会改变图片框控件的样式。

 private void button8_Click(object sender, EventArgs e)
        {
            int cnt = 0;
            foreach (PictureBox pb in panel1.Controls)
            {                
                if (pb is PictureBox)
                {
                    cnt++;
                    //do stuff
                    excludelist1.Add(pb.Name);
                    //clickedPictureBox.Hide();                        
                    pb.BorderStyle = BorderStyle.FixedSingle;
                    pb.Tag = Color.Blue;
                }
            }
            label1.Text = "Exclusded Count = " + cnt;    
        }

//上面的代码给我 'unable to cast label from panel' 错误。 请问我该如何解决这个问题?

您的面板包含多种 Control 类型,而不仅仅是 PictureBox 类型。按如下方式更改循环:

foreach (var pb in panel1.Controls.OfType<PictureBox>())
{
   cnt++;
   //do stuff 
   excludelist1.Add(pb.Name); 
   //clickedPictureBox.Hide(); 
   pb.BorderStyle = BorderStyle.FixedSingle;
   pb.Tag = Color.Blue;
}

OfType<TResult>() 是一个 IEnumerable LINQ 扩展,它将按指定类型过滤 Controls 集合 - 在您的例子中,PictureBox。由于集合现在在 foreach 循环开始时被过滤,因此您不需要 if (pb is PictureBox) 语句 - 只有 PictureBoxes 将被循环。

顺便说一下,if 语句没有帮助你的原因是 foreach 试图将 Label 转换为 PictureBox,这导致InvalidCastException之前你的支票有机会 运行。从技术上讲,您的方法也可以工作,只需延迟转换操作,直到您知道它是 PictureBox:

foreach (var control in panel1.Controls)
{ 
   if (control is PictureBox pb) 
   { 
      cnt++; 
      //do stuff 
      excludelist1.Add(pb.Name); 
      //clickedPictureBox.Hide(); 
      pb.BorderStyle = BorderStyle.FixedSingle;
      pb.Tag = Color.Blue; 
   } 
}

link OfType 方法的文档 - 我发现该解决方案更优雅一些,但任何一种方法都有效 - https://docs.microsoft.com/en-us/dotnet/api/system.linq.enumerable.oftype?view=net-5.0