16,722
社区成员




sub
...
...
checkbox1.Checked= true
...
...
End sub
Sub checkbox1_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles checkbox1.CheckedChanged
If checkbox1.CheckState = CheckState.Unchecked Then
checkbox1.CheckState = CheckState.Checked
checkbox2.CheckState = CheckState.Unchecked
checkbox3.CheckState = CheckState.Unchecked
Else
checkbox1.CheckState = CheckState.Unchecked
checkbox1.CheckState = CheckState.Unchecked
checkbox1.CheckState = CheckState.Unchecked
End If
End Sub
CheckBox[] boxArr = new CheckBox[3];
private void Form1_Load(object sender, EventArgs e)
{
boxArr[0] = this.checkBox1;
boxArr[1] = this.checkBox2;
boxArr[2] = this.checkBox3;
this.BindEvent();
}
private void BindEvent(bool bind = true)
{
for (var i = 0; i < boxArr.Length; i++)
{
if (bind)
{
boxArr[i].CheckedChanged += CheckBox_CheckedChanged;
}
else
{
boxArr[i].CheckedChanged -= CheckBox_CheckedChanged;
}
}
}
private void CheckBox_CheckedChanged(object sender, EventArgs e)
{
var nowCheckBox = sender as CheckBox;
if(nowCheckBox!=null)
{
this.BindEvent(false);
for (var i = 0; i < boxArr.Length; i++)
{
if(boxArr[i]!= nowCheckBox)
{
boxArr[i].CheckState = CheckState.Unchecked;
}
}
this.BindEvent();
}
}
我写了C#版的,对于当前被点击的CheckBox其实没必要做任何操作if(!checkbox1.Checked)
checkbox1.Checked= true;
对于其它的也是如此,控件的任何属性修改都应该如此。这是因为——控件的属性通常会触发事件。
如果先判断后修改,那么就不会产生事件触发循环。如果果真触发了死循环,那么你的业务逻辑本身就是死循环,而不是编程问题。Dim editing As Boolean = False
Sub checkbox1_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles checkbox1.CheckedChanged
If editing = False Then
editing = True
If checkbox1.CheckState = CheckState.Unchecked Then
checkbox1.CheckState = CheckState.Checked
checkbox2.CheckState = CheckState.Unchecked
checkbox3.CheckState = CheckState.Unchecked
Else
checkbox1.CheckState = CheckState.Unchecked
checkbox1.CheckState = CheckState.Unchecked
checkbox1.CheckState = CheckState.Unchecked
End If
editing = False
End If
End Sub