我在Windows窗体上有几个分组框,带有复选框,数字选择器和数字选择器。组合框。如果未选中该复选框,我希望禁用其他元素。除了加载后的复选框,我已经禁用了所有内容,然后编码' if / else' CheckedChanged事件的标准,一切正常。但是,一些组框依赖于早期形式的另一个条件。因此,如果用户尝试选择该复选框但条件无效,我想显示一条消息,取消选中该复选框并禁用组框中的其他元素,直到用户返回并更改条件...或者只是按原样接受事物并继续前进。除了消息框显示两次,即显示,取消,再次显示之外,所有的工作都与预期的一样,除非显示,取消,再次显示...我在选中此框时会再次思考,如果未选中则会再次思考(如果我只是让它检查,但禁用,消息只显示一次,但那有点难看。;-(有没有更好的方法来做到这一点?
private void checkbox1_CheckedChanged(object sender, EventArgs e)
{
if(var1 == "YES")
{
if (checkbox1.Checked)
{
numbox.Enabled = true;
combobox1.Enabled = true;
}
else
{
numbox.Enabled = false;
combobox1.Enabled = false;
}
}
else
{
MessageBox.Show("Required condition is not YES");
checkbox1.Checked = false;
}
}
答案 0 :(得分:1)
就像@LarsTech说的那样......你要两次召集你的活动。 这是一个可能的解决方法。只需在您的方法开头删除您的活动即可。最后......再添加一次。
private void checkbox1_CheckedChanged(object sender, EventArgs e)
{
checkbox1.CheckChanged -= checkbox1_CheckedChanged;
if(var1 == "YES")
{
if (checkbox1.Checked)
{
numbox.Enabled = true;
combobox1.Enabled = true;
}
else
{
numbox.Enabled = false;
combobox1.Enabled = false;
}
}
else
{
MessageBox.Show("Required condition is not YES");
checkbox1.Checked = false;
}
checkbox1.CheckChanged += checkbox1_CheckedChanged;
}
答案 1 :(得分:1)
您可以删除并读取事件处理程序,如下例所示。
else
{
MessageBox.Show("Required condition is not YES");
checkbox1.CheckedChanged -= checkbox1_CheckedChanged;
checkbox1.Checked = false;
checkbox1.CheckedChanged += checkbox1_CheckedChanged;
}
答案 2 :(得分:1)
您可以使用checkbox1_CheckedChanged
事件来检测用户输入,而不是checkbox1_Click
事件。如果您更改了程序中的checkbox1.Checked
状态,则不会引发checkbox1_Click
事件。
private void checkbox1_Click(object sender, EventArgs e)
{
//your code
}
答案 3 :(得分:1)
似乎没有必要显示消息,如果该框已被取消选中则取消选中该框...那么为什么不在显示消息之前检查是否已选中该框,而不是经常摆弄事件登记?
private void checkbox1_CheckedChanged(object sender, EventArgs e)
{
if(var1 == "YES")
{
if (checkbox1.Checked)
{
numbox.Enabled = true;
combobox1.Enabled = true;
}
else
{
numbox.Enabled = false;
combobox1.Enabled = false;
}
}
else if (checkbox1.Checked)
{
MessageBox.Show("Required condition is not YES");
checkbox1.Checked = false;
}
}