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