我无法使用子对象更新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.
答案 0 :(得分:3)
您不应该在迭代中删除集合中的项目。相反,您应该创建一个临时List<>
来存储对您确定必须删除的项的引用,然后在使用迭代器的代码之外的代码中删除它们。
答案 1 :(得分:0)
@Andrew Barber了解您收集修改后的例外的原因。
顺便说一下,您似乎希望将GUI与轮询的实现隔离开来,以获得最新的对象状态。
为什么不创建一个实现IBindingList
的自定义集合(可能是从BindingList派生)然后将其绑定到GUI。
答案 2 :(得分:0)
我找到了一个更优雅的解决方案here。