ListViewの値取得について – プログラミング – Home

ListViewの値取得について
 
通知
すべてクリア

[解決済] ListViewの値取得について


C#初心者
 C#初心者
(@C#初心者)
ゲスト
結合: 22年前
投稿: 29
Topic starter  

カラムが3つあるListView1とListView2を左右に並べているフォー
ムがあり左のListView1のセルを選択してボタンを押下すると選択
したセルの内容が右のListView2のセルに追加されるようなものを
作成してます。

列1 列2 列3

あ  い  う

Listviewitem items = new Listviewitem();

として

items = listView1.SelectedItems

ListView2.Items.Add(items);

とするとビルドは出来るのですが実行時にエラーとなります。

itemsの中身は配列のようになっていてあ、い、うの値がきち
んと入っております。

よろしければアドバイスお願いします


引用未解決
トピックタグ
aetos
(@aetos)
Noble Member
結合: 5年前
投稿: 1480
 

何というエラーが出るのですか?
エラーの種類とエラーメッセージを掲載してください。

エラーの種類は、たとえば、

try
{
  ListView2.Items.Add(items);
}
catch( Exception ex )
{
  MessageBox.Show( ex.GetType().Name );
  throw;
}

とすれば調べられます。


返信引用
YuO
 YuO
(@YuO)
ゲスト
結合: 22年前
投稿: 320
 

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に追加す
る必要があります。


返信引用
C#初心者
 C#初心者
(@C#初心者)
ゲスト
結合: 22年前
投稿: 29
Topic starter  

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へ変換出来ませんとエラーになります。


返信引用
C#初心者
 C#初心者
(@C#初心者)
ゲスト
結合: 22年前
投稿: 29
Topic starter  

たびたびすみません。

以下のように修正したら意図した通りに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について大変勉強になりました。また何かありましたら宜しく
お願いします。


返信引用
aetos
(@aetos)
Noble Member
結合: 5年前
投稿: 1480
 

まぁおそらくそんなエラーであろうと最初の段階で見当はついていたが、この説明はわか
りにくい。

> このバージョンの Add メソッドは通常、他の ListView コントロールから項目を
> 再利用するため、または ListViewItem が、コレクションに追加する前に手動で
> 作成された場合に使用します。

http://msdn2.microsoft.com/ja-jp/library/3a7fwahe.aspx


返信引用
C#初心者
 C#初心者
(@C#初心者)
ゲスト
結合: 22年前
投稿: 29
Topic starter  

シャノンさん

> このバージョンの Add メソッドは通常、他の ListView コントロールから項目を
> 再利用するため、または ListViewItem が、コレクションに追加する前に手動で
> 作成された場合に使用します。

確かに分かりづらい説明ですね・・・。AddメソッドかInsertかどちらを使用したら
よいかが明確に分かりづらいです。MSDNももう少し初心者に分かりやすいような作り
にしてほしいと思います。


返信引用
aetos
(@aetos)
Noble Member
結合: 5年前
投稿: 1480
 

いや、Closeする必要があるなんて一言も書いてないという意味でさ。
Cloneでなくとも、一方のListViewからRemoveしたものを他方にAddするのでもいいのかも
しれんが。

あと、Addのドキュメントには例外が書いてないのもいただけないね。


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました