【问题标题】:Loop through colored checkboxes循环遍历彩色复选框
【发布时间】:2021-06-20 05:10:47
【问题描述】:

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

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

【问题讨论】:

  • 为所有人使用 common 绘画事件! (全选并将事件名称粘贴到事件窗格的 Paint 插槽中!) - 将 sender 投射到复选框以确定它是哪个以及要使用哪种颜色。您还可以将每个标签设置为填充颜色,如果它总是相同的话..
  • 我不记得使用普通的绘画事件......我立即尝试了!非常感谢“TaW”

标签: c# winforms events


【解决方案1】:

确实,正如 TaW 所说(我会实施),您可以:

  • 点击CheckBox1_Paint并按Ctrl-R-R,重命名为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
  • 现在您只需在每个复选框的 Tag 属性中输入一个颜色的字符串名称。或者,您可以将前色或后色着色为您想要的颜色并在代码中使用它,而不是从标签中的字符串解析
  • 最后,一旦在它们上面写了0 references,您就可以删除 Paint 事件处理程序(删除仍然由设计器引用的事件处理程序将导致错误,这意味着您必须编辑表单的 Designer.cs 才能获得设计师再次展示)

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

【讨论】:

  • 非常感谢您的支持,Caius :)
【解决方案2】:

您可以为 Checkboxes 和要填写的相应颜色声明 Dictionary 或 KeyValuePair,如下所示:

private Dictionary<CheckBox, Brush> _checkboxColours;

然后在您的构造函数中填充字典,如下所示:

this._checkboxColours = new Dictionary<CheckBox, Brush>
            {
                { this.checkBox1, Brushes.Red },
                { this.checkBox2, Brushes.Green },
                { this.checkBox3, Brushes.Yellow },
                { this.checkBox4, Brushes.Green },
                { this.checkBox5, Brushes.Yellow },
            };

然后您可以像这样为每个复选框指定绘制方法:

            this.checkBox1.Paint += this.CheckBox_Paint;
            this.checkBox2.Paint += this.CheckBox_Paint;
            this.checkBox3.Paint += this.CheckBox_Paint;
            this.checkBox4.Paint += this.CheckBox_Paint;
            this.checkBox5.Paint += this.CheckBox_Paint;

然后您可以为每个使用 Dictionary 查找要绘制的颜色然后填充它们的 1 个绘制方法,如下所示:

private void CheckBox_Paint(object sender, PaintEventArgs e)
        {
            var checkbox = sender as CheckBox;
            if ((bool)(checkbox?.Checked))
            {
                var parsed = _checkboxColours.TryGetValue(checkbox, out Brush color);
                if (parsed)
                {
                    e.Graphics.FillRectangle(color, 0, 0, 13, 13);
                }
                else
                {
                    e.Graphics.FillRectangle(Brushes.White, 0, 0, 13, 13);
                }
            }
        }

运行时是这样的:

【讨论】:

  • 会更新,我正在工作,目前在答案框中输入了所有内容,我的错。
  • 解决一个问题就是一个新问题; ) 代码 sn-p 漂亮清晰!非常感谢您对康纳的支持和帮助!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-16
  • 2013-04-19
  • 2017-12-01
  • 1970-01-01
相关资源
最近更新 更多