Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/300.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在WPF的codebehind中执行此操作时,如何避免出现组合框SelectionChanged事件?_C#_Events - Fatal编程技术网

C# 在WPF的codebehind中执行此操作时,如何避免出现组合框SelectionChanged事件?

C# 在WPF的codebehind中执行此操作时,如何避免出现组合框SelectionChanged事件?,c#,events,C#,Events,我有一个函数将更改组合框选定的索引,因此combobox\u selectionchanged事件将自动上升,但此事件的处理程序将再次调用我的函数,因此该函数将被调用两次 是否有任何方法可以防止在下面的函数中出现选择更改事件 private void Refresh_Window() { Monthes_ComboBox.SelectedIndex = DM.Month - 1; } 我想避免对我的问题进行冗长的描述,所以我只是问了这个问题。我正在设计一个日历,组合框包含一年中的几个月

我有一个函数将更改组合框选定的索引,因此combobox\u selectionchanged事件将自动上升,但此事件的处理程序将再次调用我的函数,因此该函数将被调用两次

是否有任何方法可以防止在下面的函数中出现选择更改事件

private void Refresh_Window()
{
    Monthes_ComboBox.SelectedIndex = DM.Month - 1;
}

我想避免对我的问题进行冗长的描述,所以我只是问了这个问题。我正在设计一个日历,组合框包含一年中的几个月,但有两个按钮将转到下一个月或上一个月,因此我必须通过代码更改组合框索引,我创建了一个函数,并在表单加载和组合框选择中调用它,然后单击按钮,我可以以更好的方式设计它吗?而且Refresh\u window不仅改变了combobox\u selectedindex,它还改变了表单中的所有标签和文本块,所以我只想让Refresh\u window完成所有的更改,如果你使用一个函数来引发一个事件,并且你从事件处理程序调用了同一个函数,据我所知,这至少是错误的,不是最优的

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();
     }
     ...
}
通常,使用组合框,您可以简单地分配
SelectedValue
,控件将使用该值选择项目,然后所选索引将更改为该项目的索引,您实际上不需要直接设置所选索引


如果你真的想按索引工作,你可以自由地这样做,但我会避免这种意大利面编码,因为如果附加到激发的事件的事件处理程序也调用了相同的方法,那么这种方法会更改选定的索引…

有两种很好的方法可以做到这一点:

  • 设置一个变量,该变量指示combobox中的选定索引正在更改(您需要从内置combobox类派生)。如果所选索引再次从调用堆栈中的较深位置更改,则仍然会设置该变量,您可以在再次尝试更改所选索引之前读取该变量

  • 类似地,如果调用堆栈涉及附加到combobox的处理程序,则可以重写OnSelectedIndexChanged,如果这是所选索引第二次更改,则不执行任何逻辑


那么谁调用Refresh_Window(),何时调用?我想避免对我的问题进行冗长的描述,所以我只是问了这个问题。我正在设计一个日历,组合框包含一年中的几个月,但有两个按钮将转到下一个月或上一个月,因此我必须通过代码更改组合框索引,我创建了一个函数,并在表单加载和组合框选择中调用它,然后单击按钮,我可以以更好的方式设计它吗?刷新窗口不仅改变了组合框选择的索引,它还改变了表单中的所有标签和文本块,所以我只希望所有的更改都由刷新窗口完成。我想避免对我的问题进行冗长的描述,所以我只问了这个问题。我正在设计一个日历,组合框包含一年中的几个月,但有两个按钮将转到下一个月或上一个月,因此我必须通过代码更改组合框索引,我创建了一个函数,并在表单加载和组合框选择中调用它,然后单击按钮,我可以以更好的方式设计它吗?刷新窗口不仅仅是改变组合框选择的索引,它改变了表单中的所有标签和文本块,所以我只希望所有的改变都通过刷新窗口来完成。我使用了第二种方法,我只是在寻找一种更好的方法,如果有Hanks jalal,我已经使用了这种方法,是否有任何方法不允许刷新窗口引发任何事件?如果希望任何事件不引发,则可以在引发事件的代码之前调用
-=YourEventHandler
,在
刷新窗口的代码之后调用
+=YourEventHandler