使用面板中的控件,仅编辑图片框控件
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)
语句 - 只有 PictureBox
es 将被循环。
顺便说一下,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
面板 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)
语句 - 只有 PictureBox
es 将被循环。
顺便说一下,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