索引更改事件C#

索引更改事件C#,c#,listbox,selectedindexchanged,C#,Listbox,Selectedindexchanged,我只是想知道在第一次迭代中是否有执行索引更改事件的方法 我的代码如下所示 private void cboxEvent_IndexChange(object sender, EventArgs e) { int value; value = cboxEvent.SelectedIndex; resetListBoxes(); cboxEvent.SelectedIndex = value;

我只是想知道在第一次迭代中是否有执行索引更改事件的方法

我的代码如下所示

    private void cboxEvent_IndexChange(object sender, EventArgs e)
    {

        int value;

        value = cboxEvent.SelectedIndex;

        resetListBoxes(); 

        cboxEvent.SelectedIndex = value;

        csvExport(); 


    }

    private void cboxSLA_IndexChange(object sender, EventArgs e)
    {
        int value;

        value = cboxSLA.SelectedIndex;

        resetListBoxes(); 

        cboxNPA.SelectedIndex = value;

        csvExport(); 
    }
    private void cboxNPA_IndexChange(object sender, EventArgs e)
    {
        int value;

        value = cboxNPA.SelectedIndex;

        resetListBoxes(); 

        cboxNPA.SelectedIndex = value;

        csvExport(); 

    }
问题是,一旦索引发生更改,它就会重置其他列表框,并且它们的索引更改方法也会被激活。因此,它执行它们的IndexChange方法

我希望代码在第一个索引更改时只执行一次

有什么想法吗

提前谢谢


Chris

保留一个布尔变量,以检查是从用户还是从另一个事件处理程序触发的Indexchange事件,并且仅当Indexchange事件是从用户触发的时才继续操作。

您可以使用.Focused属性来操作
其想法是将焦点设置为关闭,以禁用第二次迭代

您需要一个标签作为焦点切换

声明一个为全局变量

Label x;
是这样的

private void cboxEvent_IndexChange(object sender, EventArgs e)
{
    if(cboxEvent.Focused)
    {
        int value;
        value = cboxEvent.SelectedIndex;
        resetListBoxes(); 
        csvExport(); 
        x.Focus();
    }
    if(!cboxEvent.Focused)
        cboxEvent.SelectedIndex = value;
}

并转到另外两个组合框。

您可以用这种方式重写Indexchange处理程序(所有处理程序都相同):


因此,如果任何索引将由用户更改,则只会运行该组合框的IndexChanged处理程序,而不会运行其他处理程序。

在您的问题中,似乎没有包含
重置列表框的代码。这让你的逻辑有点模糊。该方法中发生了什么,以及为什么要从每个
IndexChange
方法调用它?我之所以从index change方法调用它,是因为我希望每次用户更改索引时代码都会激活。我如何知道它是从user还是从event激活的?我尝试了。它仍然会进入一个循环。循环之所以发生,是因为一旦一个索引发生变化,它就会改变其他索引,并且方法会无限期地继续执行。这就是为什么我只想让它执行一次。@Chris为之前的误解感到抱歉。我已经写了几个修改过的解决方案。希望能有帮助!非常感谢你,迈克尔!真的很感激!哇,你真是个天才!非常感谢你!
private bool _IgnoreIndexChange;

private void cboxEvent_IndexChange(object sender, EventArgs e)
{
    if (_IgnoreIndexChange)
        return;

    _IgnoreIndexChange = true;
    try
    {
        int value;
        value = cboxEvent.SelectedIndex;
        resetListBoxes(); 
        cboxEvent.SelectedIndex = value;
        csvExport(); 
    }
    finally
    {
        _IgnoreIndexChange = false;
    }    
}