2011-12-10 10 views
0

私はカスタムリスト作成しました:私は移入フォームコンストラクタで今すぐ項目はローカルスコープを持って

public class Invoice : Record 
{ 
     public BList Positions = null; 
     public Invoice() 
      : base() 
     { 
      Init(); 
      this.Positions = new BList(this); 
     } 
     ... 
} 

このリストより
public class BList : IEnumerable<Position> 
{ 
     private List<Position> positions = new List<BPosition>(); 
     public void Add(Position p) 
     { this.positions.Add(p); } 
     ... 
} 

がクラスインボイスのメンバーであります請求書の収集とBListへのポジションの追加:

foreach(Invoice invoice in this.invoices) 
{ 
    // Load position for current invoice from the database 
    List<Position> positionsTmp = new List<Position>(); 
    DB.LoadRecordset(positionsTmp, "id_invoice=3"); 
    // and add to invoice positions items 
    positionsTmp.ToList().ForEach(p => invoice.Positions.Add(p)); 
} 

各請求書内のポジションの一覧はpopulatです正しく編集されました。 しかし、私はこの同じクラスの他の関数でthis.invoicesを使用すると、各請求書は位置リストが空(Count = 0)になります。位置がローカルに追加されたように見えます。アプリケーションがコンストラクタを離れると、以前に追加された位置はすべて消去されます。 各請求書のBListをクラス全体で使用できるようにするにはどうすればよいですか?あなたのクラスの名前は、「請求書」である場合

おかげ

+0

コードが混乱しています。 'Invoice'クラスのコンストラクタの名前は' Position'です。そして、 'this.Position'にアクセスする必要があると思うとき、' this.Position'を参照します。あなたのコンストラクタの 'ForEach'は' invoice.Position.Add'を呼び出す必要があると思うときに 'invoice.Position.Add'を呼び出します。私がそれを理解できるようにコードを整理してください。 –

+0

エラーを修正しました。 – Robert

+0

'foreach'ループでは、' invoice.Positions.Count() 'の戻り値はゼロではありませんが、コードの後のある時点で値はゼロですか?その場合、他の何かがリストをクリアしています。 –

答えて

0

は、その後、コンストラクタは、同様に「請求書」と呼ばれている必要があります。

BListのコンストラクタでは、 "positionsTmp"というローカルリストを初期化しています。代わりに、位置を「位置」に直接追加します。

+0

はいBListにありますはプライベートリストリストであり、BListに追加されたポジションは実際にこのプライベートリストリストに追加されています。 IEnumarableだけを実装するため、BListに追加することはできません。 – Robert

+0

BList:List に変更しました。結果は同じです。 – Robert

+0

私はあなたのコードをテストし、それは動作します。問題は、あなたが提供した例の外にあるはずです。 –

関連する問題