为什么我的功能会突然停止?

时间:2012-01-09 15:57:08

标签: c# winforms listview

这是令人不安的代码:

    private void CodesListSelectedIndexChanged(object sender, EventArgs e)
    {
        if (_doNothing) return;
        _drawMarker = false;
        _doNothing = true;
        _entitiesList.SelectedItems[0].Selected = false;
        _doNothing = false;
        Game.CurrentItem = Item.GetItemByCodeId(_codesList.SelectedIndices[0]);
    }

    private bool _doNothing;

    private void EntitiesListSelectedIndexChanged(object sender, EventArgs e)
    {
        if (_doNothing) return;
        _drawMarker = false;
        _doNothing = true;
        _codesList.SelectedItems[0].Selected = false;
        _doNothing = false;
        Game.CurrentItem = Item.GetItemByEntityId(_entitiesList.SelectedIndices[0]);
    }

基本上我有两个listViews,_codesList和_entitiesList,都有一个项目。我希望他们做的是选择一个,另一个应该取消选择。为了防止在将所选索引从相应的其他列表更改为false时触发事件,我的变量为_doNothing,在开始时设置为false。

现在,当我选择第一个项目(比如在_entitiesList中)时,会发生的事情是它到_codesList.SelectedItems [0] .Selected = false;然后它突然从功能中退出,甚至没有触发另一个事件并完成其他无关的东西,并且永远不会回到完成此功能。我已经通过调试时间和次数逐步完成它,它总是一样的。这意味着_doNothing永远不会再次设置为false,因此所有进一步的事件调用都会立即失败...

Wtf正在发生?

3 个答案:

答案 0 :(得分:1)

当SelectedItems.Count == 0抛出异常时,尝试访问SelectedItems [0]。 (“索引超出范围”或类似的东西。)您不能将调试器配置为在抛出异常时停止,因此您永远不会发现它。当抛出异常时,函数的退出和它所做的其他不相关的东西可能都是常规过程的一部分。对此的提示应该是在调试器的locals视图中出现$ exception条目。

该怎么做:首先,确保您已配置visual studio以始终停止所有异常。 (有些人没有这样做,因为它开始在所有地方停止,但我认为这不是不这样做的理由;这是去每个地方并修复错误的理由。)其次,使用Clear()集合的SelectedItems方法,当集合恰好为空时,它不会抛出异常。

答案 1 :(得分:0)

这听起来像你正在查看的代码,而调试不是实际编译的代码。尝试做一个构建 - >清理,然后完成重建(在Visual Studio中按Ctrl + Shift + B)。

答案 2 :(得分:0)

在选择项目之前,

SelectedItems [0]不存在(返回null)。当您的代码尝试在null值上设置Selected属性时,它会抛出异常。

最好使用Binding将Items [0] .Selected值设置为Items [0]的反转。在另一个ListView中选择。