2010-11-19 15 views
2

ListBoxを子オブジェクトで更新し続けるのに問題があります。更新されたオブジェクトのリストボックスを保持する方法は?

私は2つのListを使用しています。合計と現在とタイマー。 1000ミリ秒ごとに、現在の子オブジェクトセットが照会され、私の合計リストに追加されます。私の現在のリストは現在の項目だけでインスタンス化されます(の合計ではありません)。

次に、合計リストと現在のリストを比較します。現在のリストに見つからない、合計リスト内のオブジェクトがすべて削除され、続いて合計リストの各オブジェクトが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

あなたはそれを反復の真っ只中にコレクションから項目を削除しないでください。代わりに、削除する必要があると判断したアイテムへの参照を格納し、イテレータを使用しているコードの外部のコードで削除する一時的なList<>を作成する必要があります。

+1

多くの場合、 'List .RemoveAll(...)'は、これをエレガントに達成することができます。 – CodesInChaos

+0

+1私の答えを仕上げ:) –

0

@Andrew Barberはコレクション修正例外を取得する理由があります。

あなたは、オブジェクトの最新の状態を取得するために、ポーリングの実装からあなたのGUIを分離したいと思うようです。

IBindingList(おそらくBindingListから派生したもの)を実装するカスタムコレクションを作成し、それをGUIにバインドしてみましょう。

0

私はより洗練された解決策を見つけましたhere

関連する問題