Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/332.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何保持对象的更新列表框?_C#_Listbox - Fatal编程技术网

C# 如何保持对象的更新列表框?

C# 如何保持对象的更新列表框?,c#,listbox,C#,Listbox,我无法使用子对象更新列表框 我使用了两个Lists,total和current,以及一个计时器;每1000毫秒查询一次当前子对象集,并将其附加到我的总列表中。然后,我的当前列表将仅用当前项目(不读取总数)实例化 然后比较总列表和当前列表。将删除“总计”列表中未在当前列表中找到的所有对象,然后将“总计”列表中的每个对象添加到列表框中 private List<IAgStkObject> _liveListOfEntities; private List<IAgStkObject&

我无法使用子对象更新列表框

我使用了两个
List
s,total和current,以及一个计时器;每1000毫秒查询一次当前子对象集,并将其附加到我的总列表中。然后,我的当前列表将仅用当前项目(不读取总数)实例化

然后比较总列表和当前列表。将删除“总计”列表中未在当前列表中找到的所有对象,然后将“总计”列表中的每个对象添加到列表框中

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);
        }
    }
}
private List_-livelistof实体;
私有列表_totalistofentities=新列表();
私有void UpdateEntityList(){
IAgStkObjectElementCollection标准实体;
if(_stkObjectRoot.HasChildren){
_liveListOfEntities=新列表();
foreach(AgESTKObjectType)元素类型
在Enum.GetValues中(typeof(AgESTKObjectType))){
stkscenario实体=
_stkObjectRoot.CurrentScenario.Children.GetElements(TypeOfeElement);
foreach(stkScenarioEntities中的IAgStkObject实体){
_添加(实体);
如果(!\u totalistofenties.Contains(实体)){
_总数。添加(实体);
}
}               
}
foreach(Igastkobject实体在_Totalistofntities){
如果(!\u实体的liveListOfEntities.Contains(实体)){
//除去
_删除(实体);
}
如果(!lsbenties.Items.Contains(entity.InstanceName))包含,则为else{
lsbenties.Items.Add(entity.InstanceName);
}
}
}

当删除任何对象时,我总是遇到一个异常:
集合被修改;枚举操作可能不会执行。

您不应该在迭代过程中从集合中删除项。相反,您应该创建一个临时的
列表来存储对您确定必须删除的项的引用,并且然后在使用迭代器的代码之外的代码中删除它们。

@Andrew Barber解释了为什么会出现集合修改异常

另一方面,您似乎希望将GUI与轮询的实现隔离开来,以获取对象的最新状态


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

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

在许多情况下
List.RemoveAll(…)
可以优雅地实现这一点。