如何确保在事件方法

时间:2017-10-02 12:20:33

标签: c# events checklistbox

所以这个问题非常简单。我有一个checkedListBox,在ItemCheck上我想调用我的Method UpdateGraph()。问题是,如果我在事件中调用它,它会在项目被视为检查之前运行UpdateGraph方法。由于更新图方法使用foreach(checkListBox.CheckedItems中的var项) 重要的是已经应用了checked或not的新值。

我尝试通过在事件中手动设置新值来解决方法,但这给了我一个StackOverflowException。

private void checkedListBox3_ItemCheck(object sender, ItemCheckEventArgs e)
{

    if (e.NewValue == CheckState.Checked)
    {
        checkedListBox3.SetItemChecked(e.Index, true);
    }
    else
    {
        checkedListBox3.SetItemChecked(e.Index, false);
    }

    UpdateChart();
}

它在我使用SetItemChecked的行上给了我一个例外。 只是为了重新声明,我希望在UpdateChart()之前检查项目,并且只是调用UpdateChart()似乎不会这样做。有没有任何变通方法可以在项目进入UpdateChart()方法之前检查项目?

编辑:谢谢,我现在明白为什么我现在得到StackOverflowException,但无论如何确保项目采用新的CheckState而不手动将其传递给我的UpdateGraph方法?它是一个通用的方法,不会经常通过我的checkedListBox3_itemCheck事件,所以传入newCheckstate可能会使事情变得复杂。请注意,我可以使用If来检查我的传入值并使用某种类型的标识符来确定是否需要使用它,但如果我在进入之前无法找到任何其他更新检查状态的话,这可能是我的最后一个解决方案方法。

1 个答案:

答案 0 :(得分:0)

正如你所指出的那样,在设置值之后没有发生OnItemChecked事件,所以你必须考虑另一种方式:

您可以将更新方法重构为UpdateGraph(int? changedIndex = null, bool isChecked = false)这样的方法,您可以将其称为UpdateGraph(),当前使用它然后

private void checkedListBox3_ItemCheck(object sender, ItemCheckEventArgs e)
{
    UpdateGraph(e.Index, e.NewValue == CheckState.Checked);
}

正常评估foreach后,您可以检查changedIndex == null并做出相应的反应。