首页 > 解决方案 > 循环遍历彩色复选框

问题描述

我的表单上有五种不同颜色的复选框背景,我想压缩可执行代码段(见下文)。有没有办法做得更好?

private void CheckBox1_Paint(object sender, PaintEventArgs e)
{
    if (checkBox1.Checked)
    {
        e.Graphics.FillRectangle(Brushes.Red, 0, 0, 13, 13);
    }
}
private void CheckBox2_Paint(object sender, PaintEventArgs e)
{
    if (checkBox2.Checked)
    {
        e.Graphics.FillRectangle(Brushes.Green, 0, 0, 13, 13);
    }
}
private void CheckBox3_Paint(object sender, PaintEventArgs e)
{
    if (checkBox3.Checked)
    {
        e.Graphics.FillRectangle(Brushes.Yellow, 0, 0, 13, 13);
    }
}
private void CheckBox4_Paint(object sender, PaintEventArgs e)
{
    if (checkBox4.Checked)
    {
        e.Graphics.FillRectangle(Brushes.Green, 0, 0, 13, 13);
    }
}
private void CheckBox5_Paint(object sender, PaintEventArgs e)
{
    if (checkBox5.Checked)
    {
        e.Graphics.FillRectangle(Brushes.Yellow, 0, 0, 13, 13);
    }
}

标签: c#winformsevents

解决方案


事实上,正如 TaW 所评论的(我会实施的),您可以:

  • 单击CheckBox1_Paint并按Ctrl-RR,将其重命名为AnyCheckBox_Paint
  • 将代码更改为:
private void AnyCheckBox_Paint(object sender, PaintEventArgs e)
{
    if (sender is CheckBox cb && cb.Checked)
    {
        using(var b = new SolidBrush(Color.FromName(cb.Tag.ToString())))
            e.Graphics.FillRectangle(b, 0, 0, 13, 13);
    }
}
  • 访问设计器并选择所有复选框,转到属性网格闪电(事件),然后AnyCheckBox_Paint从 Paint 事件行旁边的下拉列表中选择
  • 现在您只需在每个复选框的 Tag 属性中放置一个颜色的字符串名称。或者,您可以将前色或后色着色为您想要的颜色并在代码中使用它,而不是从标签中的字符串解析
  • 最后,一旦在它们上方写入 Paint 事件处理程序,您就可以删除0 references它们(删除仍然由设计器引用的事件处理程序将导致错误,这意味着您必须编辑表单的 Designer.cs 以使设计器再次显示)

如果需要,您还可以查看缓存画笔,而不是使用它们并处理它们


推荐阅读