カラムが3つあるListView1とListView2を左右に並べているフォー
ムがあり左のListView1のセルを選択してボタンを押下すると選択
したセルの内容が右のListView2のセルに追加されるようなものを
作成してます。
列1 列2 列3
あ い う
Listviewitem items = new Listviewitem();
として
items = listView1.SelectedItems
で
ListView2.Items.Add(items);
とするとビルドは出来るのですが実行時にエラーとなります。
itemsの中身は配列のようになっていてあ、い、うの値がきち
んと入っております。
よろしければアドバイスお願いします
何というエラーが出るのですか?
エラーの種類とエラーメッセージを掲載してください。
エラーの種類は、たとえば、
try
{
ListView2.Items.Add(items);
}
catch( Exception ex )
{
MessageBox.Show( ex.GetType().Name );
throw;
}
とすれば調べられます。
ListViewItemは,
・特定のListViewと関連付いていない
・ただ1つのListViewと関連付いている
のどちらかである必要があります。
そのため,
> ListView2.Items.Add(items);
を行うと,itemsは複数のListViewと関連付けられてしまうため,例外が発生していま
す。
MSDNに
http://msdn2.microsoft.com/ja-jp/library/system.windows.forms.listviewitem.aspx
> Clone メソッドを使用すると、既存の ListViewItem オブジェクトのコピーを作成し
て、他の ListView コントロールで再利用できます。
とある通り,Cloneメソッドを使ってオブジェクトを複製して,それをListView2に追加す
る必要があります。
YuOさん
アドバイスありがとうございます。
Listview1
項目1 項目2 項目3
あ い う
for(int icnt = 0; icnt < Listview1.SelectedItems.Count; icnt++)
{
ListView items = new ListViewItem();
items = Listview1.SelectedItems[icnt];
Listview2.Items.Add(items); →ここで例外エラー発生!
追加情報:複数の場所にアイテムあを追加
または挿入することが出来ません。最初に現
在の場所から削除するか、複製を作成しなけ
ればなりません。
}
itemsの中身は・・・
items.Textには、あ
items.SubItems[1].Textにはい
items.SubItems[2].Textにはう
が格納されています。
Cloneメソッドを使用して
items = Listview1.SelectedItems[icnt];
System.Object o = items.clone();
としましたがその後のListview2へどのように追加したらいのでしょうか?
Listview2.Items.Add(o);
としてもobjectからstringへ変換出来ませんとエラーになります。
たびたびすみません。
以下のように修正したら意図した通りにListview2へ値が追加されました。
いろいろとありがとうございました。
for(int icnt = 0; icnt < Listview1.SelectedItems.Count; icnt++)
{
ListView items = new ListViewItem();
items = Listview1.SelectedItems[icnt];
Listview2.Items.Insert(icnt,(ListViewItem)items.Clone());
}
Cloneについて大変勉強になりました。また何かありましたら宜しく
お願いします。
まぁおそらくそんなエラーであろうと最初の段階で見当はついていたが、この説明はわか
りにくい。
> このバージョンの Add メソッドは通常、他の ListView コントロールから項目を
> 再利用するため、または ListViewItem が、コレクションに追加する前に手動で
> 作成された場合に使用します。
http://msdn2.microsoft.com/ja-jp/library/3a7fwahe.aspx
シャノンさん
> このバージョンの Add メソッドは通常、他の ListView コントロールから項目を
> 再利用するため、または ListViewItem が、コレクションに追加する前に手動で
> 作成された場合に使用します。
確かに分かりづらい説明ですね・・・。AddメソッドかInsertかどちらを使用したら
よいかが明確に分かりづらいです。MSDNももう少し初心者に分かりやすいような作り
にしてほしいと思います。
いや、Closeする必要があるなんて一言も書いてないという意味でさ。
Cloneでなくとも、一方のListViewからRemoveしたものを他方にAddするのでもいいのかも
しれんが。
あと、Addのドキュメントには例外が書いてないのもいただけないね。