Как сохранить обновленный список объектов? - PullRequest
2 голосов
/ 19 ноября 2010

У меня проблемы с сохранением ListBox обновленным дочерними объектами.

Я использую два List с, общий и текущий, и таймер; каждые 1000 мс запрашивается текущий набор дочерних объектов, который добавляется в мой общий список. Мой текущий список создается только с текущими элементами ( прочитано не общее).

Затем я сравниваю общий список и текущий список. Любые объекты в общем списке, не найденные в текущем списке, удаляются, а затем каждый объект из общего списка затем добавляется в ListBox.

private List<IAgStkObject> _liveListOfEntities;
private List<IAgStkObject> _totalListOfEntities = new List<IAgStkObject>();

private void UpdateEntityList() {
    IAgStkObjectElementCollection stkScenarioEntities;

    if (_stkObjectRoot.HasChildren) {
        _liveListOfEntities = new List<IAgStkObject>();

        foreach (AgESTKObjectType typeOfElement 
           in Enum.GetValues(typeof(AgESTKObjectType))) {
             stkScenarioEntities = 
             _stkObjectRoot.CurrentScenario.Children.GetElements(typeOfElement);

        foreach (IAgStkObject entity in stkScenarioEntities) {
            _liveListOfEntities.Add(entity);

            if (!_totalListOfEntities.Contains(entity)) {
                _totalListOfEntities.Add(entity);
            }
        }               
    }

    foreach (IAgStkObject entity in _totalListOfEntities) {
        if (!_liveListOfEntities.Contains(entity)) {
            // remove
            _totalListOfEntities.Remove(entity);
        }
        else if (!lsbEntities.Items.Contains(entity.InstanceName)) {
            lsbEntities.Items.Add(entity.InstanceName);
        }
    }
}

Я получаю исключение при удалении любого объекта: Collection was modified; enumeration operation may not execute.

Ответы [ 3 ]

3 голосов
/ 19 ноября 2010

Вы не должны удалять элементы из коллекции во время итерации. Вместо этого вы должны создать временный List<> для хранения ссылок на определенные вами элементы, которые должны быть удалены, а затем удалить их в коде вне кода, использующего итератор.

0 голосов
/ 22 ноября 2010

Я нашел более элегантное решение здесь .

0 голосов
/ 19 ноября 2010

@ Эндрю Барбер имеет причину, по которой вы получаете исключения, измененные коллекцией.

Кроме того, кажется, что вы хотели бы изолировать свой графический интерфейс от реализации опроса, чтобы получить самое последнее состояние объектов.

Почему бы не создать собственную коллекцию, которая реализует IBindingList (возможно, путем наследования от BindingList), а затем связать ее с GUI.

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