我有一个窗体,左边是一个面板,它完全由单选按钮组成,中间有一个tabcontrol,里面有多个标签页。这些单独的每个标签页都有一系列数据网格视图,根据您检查的单选按钮显示和隐藏。
我通过让左侧的每个单选按钮分配一个CheckChanged事件来完成此效果,该事件遍历tabpagecontrol.SelectedTab中的所有控件,并在相应的datagridview上调用.Show()并调用。隐藏其余部分,以便一次只能看到一个数据网格视图。
当我尝试以编程方式检查其中一个RadioButton时出现我的问题。让我们在方法X中说,我写了RadioButtonA.checked = true。这会触发通常的CheckedChange事件处理,它会循环遍历当前所选tabpage页面上的所有datagridviews,并调用.Hide()除了一个datagridview表单之外的所有内容,而radiobutton应调出并调用.Show()。但是,在其中一个.Hide()调用datagridview时,它最终会再次触发RadioButtonA.CheckedChange事件 AGAIN 。当我查看传递给函数的sender参数时,它显示发件人是我刚刚以编程方式单击的RadioButton。
我正在以编程方式添加这些datagridviews,并且可以确认没有任何事件处理程序分配给它们。任何人都可以帮我确定是什么导致这个额外的事件被触发?感谢。
答案 0 :(得分:0)
对于在我的表单上涓涓细流而烦恼其他事件处理程序的令人讨厌的更改事件,我发现唯一的解决方案是添加一个小布尔值:
bool radioIng;
void MyMethod() {
radioIng = true;
try {
radioButton1.Checked = true;
// etc.
} finally {
radioIng = false;
}
}
void radioButton_EventHandler(object sender, EventArgs e) {
if (radioIng) return;
// rest of code here
}
修改强>
或者,您可以删除所有事件处理程序并稍后重新连接:
void MyMethod() {
try {
radioButton1.CheckChanged -= radioButton_EventHandler;
radioButton2.CheckChanged -= radioButton_EventHandler;
radioButton3.CheckChanged -= radioButton_EventHandler;
// execute your code
radioButton1.Checked = true;
} finally {
radioButton1.CheckedChanged += new EventHandler(radioButton_EventHandler);
radioButton2.CheckedChanged += new EventHandler(radioButton_EventHandler);
radioButton3.CheckedChanged += new EventHandler(radioButton_EventHandler);
}
}
void radioButton_EventHandler(object sender, EventArgs e) {
if (sender == radioButton1) {
// code here to handle
} else if (sender == radioButton2) {
// code here to handle
} else if (sender == radioButton3) {
// code here to handle
}
}