-1

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

我通过手动设置事件中的新值尝试了一种解决方法,但这给了我一个 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 来检查我传入的值并使用某种标识符来确定是否需要使用它,但如果我在进入之前找不到任何其他东西来更新检查状态,这可能是我的最后一个解决方案方法。

4

1 回答 1

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并做出相应的反应。

于 2017-10-02T12:45:45.467 回答