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(…)
可以优雅地实现这一点。