2012-01-09 8 views
0

これは厄介なコード片である:私の機能が突然止まるのはなぜですか?

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]); 
    } 

は、基本的に私は2つのリストビュー、_codesListと_entitiesListを有し、両方の項目を有しています。私がしたいのは、自分が選択されたとき、もう1人が選択を外すときです。選択されたインデックスをそれぞれの他のリストからfalseに変更するときにトリガーされるイベントを防ぐために、変数_doNothingがあります。これは最初はfalseに設定されています。

ここで、_codesList.SelectedItems [0] .Selected = false;に至るまで、最初の項目を選択すると(_entitiesListで言うことができます)それは突然関数から外れて、他のイベントのトリガーさえもなくなり、他の無関係なものは完全に終了し、この関数の終了に戻ることはありません。私は何度もデバッグを繰り返してきましたが、いつも同じです。これは、_doNothingが再びfalseに設定されることはないので、その後のすべてのイベントコールはただちに失敗することを意味します。

WTFは起こっていますか?

+0

Debug +例外では、CLR例外についてはThrownボックスにチェックを入れます。 64ビットオペレーティングシステムを搭載したマシンでデバッグする場合は、プロジェクトのターゲットプラットフォーム設定をAnyCPUに設定します。 –

+0

あなたのSelectedItemsコレクションが空またはnullで、[0]にアクセスすると例外が発生すると思います。 ListView内に項目がある場合、その項目を選択する必要はありません。ただの推測。 – Tigran

+0

彼らが言ったこと。 –

答えて

1

SelectedItems.Count == 0が例外をスローすると、SelectedItems [0]にアクセスしようとしています。 (「Index Out Of Range」など)例外がスローされたときに停止するようにデバッガを設定してはいけません。例外がスローされたときに、関数から抜けることとそれがする他の無関係のものは、おそらくすべてのものの通常のコースの一部です。これのヒントは、デバッガのlocalsビューに$例外エントリが表示されるはずです。

対処:まず、すべての例外で常に停止するようにVisual Studioを設定していることを確認してください。 (一部の人はこれをやめようとしているので、これをやめようとする人もいますが、そうしないと理由はありません;それらの場所のそれぞれに行き、バグを修正する理由です)。 SelectedItemsコレクションのClear()メソッドは、コレクションがすでに空の場合には例外をスローしません。

+0

これは私が最も嫌なことです。私はいつも例外で停止するように設定しています。通常は、手動で例外をスローして捕まえることなく、即座に止まります。私が最も嫌なことは、実際にこの後にうまくいくように見えるということです。例えば、clockyからのtick()イベントは、コードをステップ実行しながら次に表示されるものです。 – xNidhogg

+0

GUIはイベント駆動型システムなので、GUIで発生するほとんどのものは、オペレーティングシステム(または、dotnet、Frameworkの場合)コードから発生したイベントの結果として発生します。したがって、デバッガが例外で停止せず、コードが例外をキャッチしない場合、例外はフレームワークにバブルアップし、フレームワークはそれと何も関係しないので、無視します。次に、次のイベントが発生すると、まるで例外がスローされなかったかのように通常どおりに処理されます。だから、私はその行動を期待するだろう。 –

+0

*本当に*困惑しているのは、例外がスローされたときにVisual Studioが停止しない理由です。違反命令の直後に、デバッガの[ローカル]または[自動]ウィンドウで$例外エントリが存在するかどうかを確認しましたか?そこにいますか? –

0

デバッグは実際にコンパイルされたコードではありませんが、あなたが見ているコードのように聞こえます。ビルド→クリーンを実行してから、完全な再ビルドを実行してください(Visual StudioではCtrl + Shift + B)。

0

アイテムが選択されるまで、SelectedItems [0]は存在しません(nullが返されます)。あなたのコードがnull値でSelectedプロパティを設定しようとすると、例外がスローされます。

バインドを使用して、Items [0] .Selected値を、他のListViewのItems [0] .Selectedの逆数に設定する方がよいでしょう。

関連する問題