ListViewの内容をコレクション等へ出力して取り出したい。 への返答

投稿で使用できる特殊コードの説明。(別タブで開きます。)
本名は入力しないようにしましょう。
投稿した後で削除するときに使うパスワードです。返答があった後は削除できません。
返答する人が目安にします。相手が小学生か社会人かで返答の仕方も変わります。
最初の投稿が質問の場合、質問者が解決時にチェックしてください。(以降も追加書き込み・返信は可能です。)
※「過去ログ」について書くときはその過去ログのURLも書いてください。

以下の返答は逆順(新しい順)に並んでいます。

投稿者 魔界の仮面弁士  (社会人) 投稿日時 2011/2/20 10:21:08
> <a href = "http://google.com/">Google</a>
> <a href = "http://yahoo.com.jp">Yahoo</a>
ひとつ質問。
データ中に「"」や「&」や「<」などが現れた場合、それらはどう表記したいですか?

出力結果を HTML や XML の形式で表記したいのであれば、たとえば
  K&R  |  http://www.amazon.co.jp/o/ISBN=406155753X
というデータの場合、これは単純に
  <a href="http://www.amazon.co.jp/o/ISBN=406155753X">K&R</a>
とするのではなく、実体参照を用いた
  <a href="http://www.amazon.co.jp/o/ISBN=406155753X">K&amp;R</a>
という表記にすることが求められますが、今回もその必要がありますか?


もしもそうしたエスケープが必要な場合、XElement 等を使う事ができます。


Private Sub Button1_Click(ByVal sender As ObjectByVal e As EventArgs) Handles Button1.Click
    Dim X = From lv In ListView1.Items.OfType(Of ListViewItem)() _
            Let Y = <a href=<%= lv.SubItems(1).Text %>><%= lv.SubItems(0).Text %></a> _
            Let Z = Y.ToString() Select Z
    TextBox1.Lines = X.ToArray()
End Sub


ただしこの手法では、
  <a href = "http://google.com/">Google</a>
ではなく、
  <a href="http://google.com/">Google</a>
という出力結果になりますのでご注意を。
投稿者 YuO  (社会人) 投稿日時 2011/2/20 01:41:16
ListView.Itemsなら全ての要素が,SelectedItemsなら選択された要素が得られます。

MSDN: ListView.Items プロパティ (System.Windows.Forms)
http://msdn.microsoft.com/ja-jp/library/system.windows.forms.listview.items.aspx
MSDN: ListView.SelectedItems プロパティ (System.Windows.Forms)
http://msdn.microsoft.com/ja-jp/library/system.windows.forms.listview.selecteditems.aspx

で,これらをFor EachでまわせばListViewItemが列挙されます。

というか,パールマンさんのコードをブレークポイントを置いてデバッグ実行してウォッチすれば確認できると思いますが……。


他の方法としては,LINQ + String.Joinでしょうか。

TextBox1.Text = String.Join(vbNewLine,
 ListView1.Items.Cast(Of ListViewItem)().Select(Function(item) String.Format("<a href = ""{1}"">{0}</a>", item.SubItems(0).Text, item.SubItems(1).Text)))

とか。ではString.JoinにIEnumerable(Of String)を受け付けるものがないので,

TextBox1.Text = String.Join(vbNewLine, _
 ListView1.Items.Cast(Of ListViewItem)().Select(Function(item) String.Format("<a href = ""{1}"">{0}</a>", item.SubItems(0).Text, item.SubItems(1).Text)).ToArray())

と,ToArrayをかます必要がありますが……。
投稿者 ビーグル犬  (社会人) 投稿日時 2011/2/19 21:44:57
すみません。
全てを取得したいのです。

選択したものだけでなく。
投稿者 ビーグル犬  (社会人) 投稿日時 2011/2/19 21:42:59
パールマンさんありがとうございます。
ただパールマンさんの変数宣言だとスコープがFor Each~Nextのみになってしまうので上位宣言しました
投稿者 パールマン  (社会人) 投稿日時 2011/2/19 00:59:28
ListViewにて選択されたItemが、と或るボタンをクリックすることにより複数行記述できるテキストボックスに、aタグ付きで出力される。
という動作でよいでしょうか。

ご質問の本文では、選択されたItemなのか全てのItemなのかが読み取れなかったのですが、‘選択されたItem’という仕様であれば間違いなかろうと解釈します。

取り出すだけでありましたら、
            For Each k As ListViewItem In ListView1.Items

                Dim SubItem0 As String = k.SubItems(0).Text  ' タイトル 
                Dim SubItem1 As String = k.SubItems(1).Text  ' URL 

            Next

取り出された、SubItem0,SubItem1にタグ文字列を追加してMultiLineプロパティをTrueにしたテキストボックスに入れればよいかと考えます。
最後以外は改行コード(VbCrLf)を付けると・・・・

いかがでしょう

投稿者 ビーグル犬  (社会人) 投稿日時 2011/2/18 23:27:11
ListViewに

タイトル    |     URL
Google     |     http://google.com/
Yahoo      |     http://yahoo.co.jp/

のようになっているとします。
ボタンを押したときにテキストボックスに

<a href = "http://google.com/">Google</a>
<a href = "http://yahoo.com.jp">Yahoo</a>

のように出力するようにしたいです。
コレクションに入れてFor Eachして取り出してどうたらこうたらすればできそうですがわかりません。
ご教授お願いします