Почему моя функция внезапно останавливается? - PullRequest
0 голосов
/ 09 января 2012

Это тревожный код:

    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 ]

1 голос
/ 09 января 2012

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

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

0 голосов
/ 09 января 2012

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

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

0 голосов
/ 09 января 2012

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...