- PR -

[C#]ListViewItemCollectionを使ったlistViewアイテムの格納と取り出し

1
投稿者投稿内容
Terol
会議室デビュー日: 2005/11/04
投稿数: 15
投稿日時: 2006-02-09 18:49
 ListViewItemCollectionにlistViewのアイテムを格納したのですが、取り出すことができなくて困っています。
 プログラムの概要は

//定義
ListView.ListViewItemCollection[] itemS=new ListView.ListViewItemCollection[3];
//格納
itemS[0]=listView1.Items;
itemS[1]=listView2.Items;
//消去
listView1.Items.Clear();
listView2.Items.Clear();
//取り出し
listView1.Items.AddRange(itemS[0]);
listView2.Items.AddRange(itemS[1]);

としており、これで元のlistView1、listView2に戻そうとしているのですが、どうしても「取り出し」の部分でエラーが発生してしまいます。
どのようにすれば、一度消したlistViewのアイテムを格納・取り出しできるのでしょうか?

じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-02-09 18:54
MSDN ライブラリの「値型と参照型」の項をよくお読みになることをお勧めします。

  2-3 値型と参照型

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
Terol
会議室デビュー日: 2005/11/04
投稿数: 15
投稿日時: 2006-02-09 22:26
「じゃんぬねっと」さん、「値型と参照型」の事項を読みました!勉強不足なもんで、こんな風になっていたとは知りませんでした。
しかしどうしても、この項と「ListViewItemCollectionの格納・取り出し」について、はっきりとした問題点を掴めないでいるのですが、
格納プログラム(itemS[0]=listView1.Items;)を見ると、
どちらも参照型であり、この地点で間違いが発生しているということなのでしょうか?
まどか
ぬし
会議室デビュー日: 2005/09/06
投稿数: 372
お住まい・勤務地: ますのすし管区
投稿日時: 2006-02-10 00:18
引用:

格納プログラム(itemS[0]=listView1.Items;)を見ると、
どちらも参照型であり、この地点で間違いが発生しているということなのでしょうか?


変数を入れ物とし、値をりんごとします。
値型は、りんごがコピーされ入れ物に入ります。
A=空っぽ
B=りんご
A=B
これで両方にりんごがあることになり、かつそれぞれ別のりんごです。
対して参照型はポインタですから
A=空っぽ
B=りんごのある場所
A=B
これで両方に「りんごのある場所」が入ります。
ここでりんごはひとつしかありません。
Items.ClearのItemsはりんごのある場所で、Clearはそこにあるりんごを消去しなさいということになります。

じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-02-10 01:06
引用:

Terolさんの書き込み (2006-02-09 22:26) より:

勉強不足なもんで、こんな風になっていたとは知りませんでした。


とあるのに、

引用:

しかしどうしても、この項と「ListViewItemCollectionの格納・取り出し」について、はっきりとした問題点を掴めないでいるのですが、


うーん。(~_~;)

結論的には、同じ入れ物の中身を消しているということになります。
A と B という変数があり、A も B も同じアドレス C を 参照 しています。
A を通じて Clear すれば、参照先である C が当然クリアされます。
A も B も同じものを参照しているので、B から参照しても、C は C なので、
既に A からクリアされた C を見ていることになります。

C/C++ などで、ポインタとか参照とかをやると概念はわかるんでしょうが...

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2006-02-12 09:35
引用:

Terolさんの書き込み (2006-02-09 22:26) より:

格納プログラム(itemS[0]=listView1.Items;)を見ると、
どちらも参照型であり、この地点で間違いが発生しているということなのでしょうか?


そうです。itemS[0] は、listView1.Items と同じになっています。これはコピーが作られるのではなく、itemS[0] という別の参照方法を定義した、ということです。
 その上で listView1.Items.Clear とすると、itemS[0].Clear としていることと同じことをしています。

 単純には、itemS[0] を別のインスタンスにして、ListViewItem を参照させます。
itemS[0].AddRange(listView1.Items);

〆 written by Jitta on 2006/02/12
1

スキルアップ/キャリアアップ(JOB@IT)