如何解决使用面板中的控件,仅编辑图片框控件
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
类型,而不仅仅是 PictureBox
es。按如下方式更改循环:
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)
语句 - 只有 PictureBox
es 将被循环。
顺便说一句,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 举报,一经查实,本站将立刻删除。