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

时间:2013-03-28 13:34:07

标签: c# winforms event-handling controls

我正在尝试轻松制作自定义复选框。我想通过它的检查状态在每个复选框的顶部绘制一个图像。如何为所有复选框创建单个事件处理程序?我有很多复选框,我不想为它编写每个事件处理程序:

    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...

4 个答案:

答案 0 :(得分:4)

将此处理程序分配给所有复选框。请注意我如何将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);
    }
}

答案 1 :(得分:1)

您可以多次使用相同的方法,只需在Paint事件中指定它(通过设计器或代码)。

要将当前复选框投射发件人设置为复选框。

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

答案 2 :(得分:1)

我认为这是基于上下文的Windows窗体?

您选择每个checkbox(您可以在表单设计器上进行多选),单击Properties面板中的闪电,找到Paint事件并输入您的方法名称:{{1} } ,在那里。

答案 3 :(得分:0)

我实际上自己找到了答案。它比为每个复选框手动分配绘图事件更容易,因为它是以编程方式完成的。

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);
相关问题