索引更改事件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;
}
}