2012-02-15 12 views
0

辞書にDatagridviewRowを追加して、DatagridviewRowを削除すると、DictionaryのDatagridviewrowも変更されます。しかし、私は、辞書は、私は、行のクローンを作成しようとしましたが、私は、行のコピーを作成してはいけないソースが変更されると辞書が変更されます

 Dictionary<int, CustomDataGridViewRow> _cache = new Dictionary<int, CustomDataGridViewRow>(); 

     public void add(int index, CustomDataGridViewRow row) 
     { 
      _cache.Add(index, row); 
     } 


     this.Rows.RemoveAt(1); 

を変更したくない、それは新しい行になります。これを見て:

enter image description here

答えて

4

次に、あなたが辞書のエントリを追加する前にオブジェクトのクローンを作成する必要があります。

辞書にはオブジェクトが含まれていません。参照が含まれています。辞書自体は変更されていません - 変更されたオブジェクトへの参照を含んでいます。

あなたのオブジェクトは、クローニングをサポートしている場合は、あなただけ使用することができます。

public void Add(int index, CustomDataGridViewRow row) 
{ 
    _cache.Add(index, (CustomDataGridViewRow) row.Clone()); 
} 

あなたはしかし詳細はDataGridViewRow.Cloneためのドキュメントを見てみたいことがあります...

いずれかの方法で、それはとても重要ですC#で参照型がどのように機能するかを理解している必要があります。そうしないと、今度は何度も繰り返し実行されます。

+0

ルック。クローンは "クローン"を作成せず、インデックス-1を持つ新しい行を作成します。私は間違って何をしていますか? –

+0

@MariusKrämer:リンク先のドキュメントを読んだことがありますか? –

+0

はい、CloneWithValuesを追加しましたが、それでもインデックスが間違っています –

2

rowを辞書に追加するときは、の参照を行に追加します。

これは、行の変更がその行へのすべての参照によって認識されることを意味します。

これは、コピーの辞書(別名クローン)に提供することで回避できます。

1

dicctionaryのみ最初の項目をクローン、参照が含まれています上の写真で

_cache.Add(index, row.Clone()); 
関連する問題