2012-01-09 3 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]); 
    } 

В принципе у меня есть два ListViews, _codesList и _entitiesList, оба имеют один элемент. Я хочу, чтобы они сделали это, когда один выбран, другой должен отменить выбор. Чтобы предотвратить случай срабатывания при изменении выбранного индекса из соответствующего другого списка на false, у меня есть переменная _doNothing, которая в начале установлена ​​в false.

Теперь, когда я выбираю первый элемент (скажем, в _entitiesList), это доходит до _codesList.SelectedItems [0] .Selected = false; то он внезапно выпадает из функции, даже не запуская событие для другого и не делает совершенно другого несвязанного материала и никогда не возвращается к завершению этой функции. Я прошел через него с отладкой раз и раз снова, и это всегда одно и то же. Это означает, что _doNothing никогда больше не устанавливается на false, поэтому все последующие вызовы событий немедленно выходят из-под причины ...

Wtf происходит?

+0

Отладка + Исключения, поставьте галочку в поле для броузера для исключений CLR. Установите для целевой платформы проекта значение AnyCPU, если вы отлаживаете машину с 64-разрядной операционной системой. –

+0

Я думаю, что ваша коллекция SelectedItems пуста или null, и доступ к ней на [0] вызывает исключение. Если ListView имеет элемент внутри, это не означает, что он должен быть выбран. Просто Угадай. – Tigran

+0

Что они сказали. –

ответ

1

Пытается получить доступ к SelectedItems [0], когда SelectedItems.Count == 0 выдает исключение. («Index Out Of Range» или что-то подобное.) Вы не должны были настроить ваш отладчик, чтобы остановить, когда генерируется исключение, поэтому вы никогда не узнаете об этом. Выпадение функции и других несвязанных вещей, которые она делает, вероятно, является частью регулярного хода вещей, когда возникает исключение. Подсказка для этого должна заключаться в появлении записи об исключении $ в представлении отладки locals.

Что делать: прежде всего, убедитесь, что вы настроили визуальную студию, чтобы всегда останавливаться на всех исключениях. (Некоторые люди воздерживаются от этого, потому что тогда он начинает останавливаться повсюду, но я думаю, что это не повод не делать этого, это повод пойти в каждое из этих мест и исправить ошибки.) Во-вторых, используйте метод Clear() коллекции SelectedItems, он не генерирует исключения, когда коллекция оказывается уже пустой.

+0

Это то, что меня больше всего беспокоит. У меня он настроен всегда останавливаться на исключениях, и обычно он делает именно это (черт возьми, если я вручную выброшу исключение и никогда не поймаю его, он немедленно прекратится). Вещь, которая меня больше всего беспокоит, заключается в том, что на самом деле она, похоже, отлично работает после этого, то есть, например, мое событие tick() с часами thingy - это следующее, что отображается при прохождении кода. – xNidhogg

+0

GUI - это управляемые событиями системы, поэтому почти все, что происходит в графическом интерфейсе, происходит в результате события, возникшего из кода операционной системы (или, в случае с dotnet, Framework).Таким образом, если отладчик не останавливается на исключение, и ваш код не поймает исключение, тогда исключение пузырится до фреймворка, и поскольку структура не имеет к этому никакого отношения, он просто игнорирует его. Затем, когда происходит следующее событие, это обычное дело, как если бы ни одно исключение не возникало. Поэтому я бы ожидал такого поведения. –

+0

Что действительно удивительно, почему Visual Studio не останавливается, когда генерируется исключение. Вы проверили наличие записи исключений $ в окне «Местные жители» или «Авто» отладчика сразу после инструкции о нарушении? Это там? –

0

Это похоже на код, на который вы смотрите, в то время как отладка не является кодом, который был фактически скомпилирован. Попробуйте сделать сборку -> чистую, а затем полную перестройку (Ctrl + Shift + B в Visual Studio).

0

SelectedItems [0] не существует (возвращает null), пока не будет выбран элемент. Когда ваш код пытается установить свойство Selected на нулевом значении, он выдает исключение.

Лучше использовать привязку для установки элементов [0]. Выбранное значение для обратного элемента [0]. Выбирается в другом ListView.

Смежные вопросы