如何保留更新的对象列表框?

时间:2010-11-19 02:45:39

标签: c# listbox

我无法使用子对象更新ListBox。

我正在使用两个List s,总计和当前值以及一个Timer;每1000ms查询当前的子对象集,并附加到我的总列表中。然后我的当前列表仅使用当前项目进行实例化(读取而不是总计)。

然后我将比较总列表和当前列表。将删除总列表中未在当前列表中找到的任何对象,然后将总列表中的每个对象添加到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 个答案:

答案 0 :(得分:3)

您不应该在迭代中删除集合中的项目。相反,您应该创建一个临时List<>来存储对您确定必须删除的项的引用,然后在使用迭代器的代码之外的代码中删除它们。

答案 1 :(得分:0)

@Andrew Barber了解您收集修改后的例外的原因。

顺便说一下,您似乎希望将GUI与轮询的实现隔离开来,以获得最新的对象状态。

为什么不创建一个实现IBindingList的自定义集合(可能是从BindingList派生)然后将其绑定到GUI。

答案 2 :(得分:0)

我找到了一个更优雅的解决方案here