我有一个会改变组合框选择索引的函数,所以combobox_selectionchanged事件会自动上升,但是这个事件的处理程序再次调用我的函数,所以函数会被调用两次!!
有没有办法防止下面函数中的selection_changed事件上升?
private void Refresh_Window()
{
Monthes_ComboBox.SelectedIndex = DM.Month - 1;
}
我想避免对我的问题进行长时间的描述,所以我只是问了这个问题。我正在设计一个日历,combo_box包含一年的monthes,但是有两个按钮将转到nextmonth或上个月,所以我必须通过代码更改combo_box索引,我创建一个函数,我在form_load中调用它和combobox_Selection_changed和button_click我可以更好地设计它吗?和Refresh_window不只是改变了combobox_selectedindex,它改变了表单中的所有标签和TextBlocks,所以我只想让所有的更改都由Refresh_window完成
答案 0 :(得分:1)
private bool _refreshCalled = false;
private void Refresh_Window()
{
_refreshCalled = true;
try
{
....
Monthes_ComboBox.SelectedIndex = DM.Month - 1;
....
}
finally
{
_refreshCalled = false;
}
}
private void OnComboBoxSelectedChanged(object sender, EventArgs e)
{
...
if (!_refreshCalled)
{
Refresh_Window();
}
...
}
答案 1 :(得分:0)
如果你使用一个函数来引发事件并从事件处理程序中调用相同的函数,那么我理解这至少是设计师的错误并且不是最佳的。
通常使用组合框你可以简单地分配SelectedValue
,控件将选择具有该值的项目,然后所选索引将更改为此类项目的索引,您不需要设置所选项目直接索引...
如果你真的想通过索引工作,你可以自由地做,但我会避免这个意大利面条编码有一个方法,如果相同的方法也被附加到事件触发器的事件处理程序调用所选的索引。
答案 2 :(得分:0)
有几种很好的方法可以做到这一点:
设置一个变量,指示所选索引在组合框中正在发生变化(您需要从内置的ComboBox类派生)。如果选择的索引从调用堆栈的较深处再次更改,则仍将设置该变量,并且您可以在尝试再次更改所选索引之前读取该变量。
同样,如果调用堆栈涉及连接到组合框的处理程序,则可以覆盖OnSelectedIndexChanged,如果这是所选索引第二次更改,则不执行任何逻辑。