所有复选框的单个事件处理程序

本文关键字:事件处理 程序 单个 复选框 | 更新日期: 2023-09-27 18:06:31

我试图轻松地使自定义复选框。我想在每个复选框上画一个图像根据它的选中状态。如何为所有复选框创建单个事件处理程序?我有很多复选框,我不想为它编写每个事件处理程序:

    private void checkbox1_Paint(object sender, PaintEventArgs e)
    {
        Rectangle rect = new Rectangle(0, 0, 16, 16);
        if (checkbox1.Checked)
        {
            e.Graphics.DrawImage(Properties.Resources.checkbox_checked, rect);
        }
        else
        {
            e.Graphics.DrawImage(Properties.Resources.checkbox_unchecked, rect);
        }
    }
    private void checkbox2_Paint(object sender, PaintEventArgs e)
    {
        Rectangle rect = new Rectangle(0, 0, 16, 16);
        if (checkbox2.Checked)
        {
            e.Graphics.DrawImage(Properties.Resources.checkbox_checked, rect);
        }
        else
        {
            e.Graphics.DrawImage(Properties.Resources.checkbox_unchecked, rect);
        }
    }
    // etc...

所有复选框的单个事件处理程序

将此处理程序分配给所有复选框。请注意我是如何将sender转换为CheckBox以获得触发事件的控件的。

private void checkbox_Paint(object sender, PaintEventArgs e)
{
    var checkbox = sender as CheckBox // Here you get the current checkbox
    Rectangle rect = new Rectangle(0, 0, 16, 16);
    if (checkbox.Checked)
    {
        e.Graphics.DrawImage(Properties.Resources.checkbox_checked, rect);
    }
    else
    {
        e.Graphics.DrawImage(Properties.Resources.checkbox_unchecked, rect);
    }
}

你可以使用相同的方法任何次数,只是分配它在油漆事件(通过设计器或从代码)。

要获取当前复选框,将sender强制转换为复选框。

private void checkbox1_Paint(object sender, PaintEventArgs e)
{
CheckBox chk = sender as CheckBox;
..
}

我假设这是基于上下文的Windows窗体?

您选择每个checkbox(您可以在窗体设计器上多选),单击Properties面板中的闪电,找到Paint事件并输入您的方法名称:checkbox1_Paint

其实我自己也找到了答案。这比手动为每个复选框分配油漆事件更容易,因为它是通过编程完成的。

public void SetAllCheckboxes(Control where)
{
    foreach (Control control in where.Controls)
    {
        if (control.GetType().Name == "CheckBox")
            control.Paint += new PaintEventHandler(this.checkbox_Paint);
        else if (control.Controls.Count > 0)
            SetAllCheckboxes(control);
    }
}

,然后写入:

SetAllCheckboxes(this);