2010-11-19 43 views
2

我在使用子對象更新ListBox時遇到問題。如何保持對象的更新列表框?

我使用了兩個List s,總數和當前值,以及一個Timer;每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); 
     } 
    } 
} 

我不斷收到異常,當任何對象被刪除:Collection was modified; enumeration operation may not execute.

回答

3

你不應該在迭代它的中間,從集合中刪除的項目。相反,您應該創建一個臨時List<>來存儲對您確定必須刪除的項目的引用,然後將代碼在使用迭代器的代碼之外的代碼中刪除。

+1

在很多情況下,'List .RemoveAll(...)'可以實現這一點。 – CodesInChaos 2010-11-21 23:37:37

+0

+1爲我完成我的答案:) – 2010-11-22 03:37:34

0

@Andrew Barber有你收集修改異常的原因。另一方面,您似乎希望將GUI與實施輪詢分離以獲取最新的對象狀態。

爲什麼不創建自定義集合來實現IBindingList(可能通過從BindingList派生),然後將其綁定到GUI。