微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决使用面板中的控件,仅编辑图片框控件

panel1 有多个图片框和标签

我想做一个只改变图片框控件样式的按钮。

 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;    
        }

//上面的代码给了我“无法从面板投射标签错误。 请问我该如何解决

解决方法

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

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,这导致了 { {1}},之前您的支票有机会运行。从技术上讲,您的方法也可以工作,只需延迟转换操作,直到您知道它是 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; } } 方法文档的链接 - 我发现该解决方案更优雅一些,但任何一种方法都有效 - https://docs.microsoft.com/en-us/dotnet/api/system.linq.enumerable.oftype?view=net-5.0

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。