1

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

    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

4 回答 4

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);
    }
}
于 2013-03-28T13:36:44.143 回答
1

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

获取当前复选框将发件人转换为复选框。

private void checkbox1_Paint(object sender, PaintEventArgs e)
{
CheckBox chk = sender as CheckBox;
..
}
于 2013-03-28T13:36:24.007 回答
1

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

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

于 2013-03-28T13:36:38.717 回答
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);
于 2013-03-28T14:26:56.150 回答