2009-08-27 4 views
5

ループを使用して複数の列のリストビュー内の各アイテムを取得するうえで効果的な方法は何ですか?ループを使用してListViewの各項目を取得しますか?

私は何かを見つけたときに何かを見つけることができなかったので、私はここでそれを分かち合いたいと思っていました。私はちょっと考えて頭を傷つけていたように出てくるようにバインドされている質問をpreemptingのようなものも??? eerrrr ....私は?

私はこのウェブサイトが気に入っていますので、私は上記の質問に私の解決策を共有したいと思っていました。後方の並べ替え私は知っているが、まだ、私はそれが誰かを助けることを知っているsomwhere。 =)

private ArrayList getItemsFromListViewControl() 
    {      
     ArrayList lviItemsArrayList = new ArrayList(); 

     foreach (ListViewItem itemRow in this.loggerlistView.Items) 
     { 
      //lviItemsArrayList.Add(itemRow.Text); <-- Already included in SubItems so ... =) 

      for (int i = 0; i < itemRow.SubItems.Count; i++) 
      { 
       lviItemsArrayList.Add(itemRow.SubItems[i].Text); 
       // Do something useful here, for example the line above. 
      } 
     } 
     return lviItemsArrayList; 
    } 

これは、ArrayListコレクションオブジェクト内の対象となるListViewコントロールに属するすべてのアイテムの線形配列ベースの表現を返します。

+0

このデータを 'ArrayList'にコピーすると、' Items'を直接反復するだけで何の利点がありますか? –

+0

質問をしてから自分の答えを出してから、それを受け入れられたものとしてマークしてください(もちろん、行の答えを書いて、それをコピー&ペーストしてください)。 – Darknight

+0

はい、あなたは正しいです。この例では、アイテムを直接繰り返し処理していますが、ArrayListオブジェクトを別の場所に保持していますので、ListViewの行数に応じて任意のサイズのarraylistオブジェクトが必要です。だから私はListViewの各項目の値を処理し、私のアプリケーションの別の部分に私の結果をフィードする必要がありました。arraylistは私が達成するのを許した。ループがリスト内で新しい行を見つけたときにコレクションが動的に増加するのを許可しました。 – IbrarMumtaz

答えて

6

ですサブアイテム。

private IEnumerable<ListViewSubItem> GetItemsFromListViewControl() 
{      
    foreach (ListViewItem itemRow in this.loggerlistView.Items) 
    {    
     for (int i = 0; i < itemRow.SubItems.Count; i++) 
     { 
      yield return itemRow.SubItems[i]); 
     } 
    } 
} 

は、.NET 3.5を使用している場合、私はあまりにもLINQを使用して示唆しているが。

+0

これはいいやり方だし、プロフェッショナルにも見えますが、私はまだこの小さなフレーキです。このタイプの戻りタイプがどのように機能するのか気になりますか? TIA – IbrarMumtaz

+0

このリンクをご覧ください:http://msdn.microsoft.com/en-us/library/dscyy5s0.aspx – mrtaikandi

0

私はコードでこれをテストする時間がありませんが、listviewメソッドの1つによって返されたコレクションで配列リストを初期化できますか?私は家に帰るときこれをチェックし、それ以前に質問に答えがないかどうかをコメントします。

編集:私はこれを本当に素早くチェックし、リストビューに入れた要素を1つ使ってarraylistをコンパイル、実行、初期化しました。

私はそれがうまくいったら教えてください...私は他のコメントにも同意します。私はそれを配列リストに変換する唯一の理由は、あなたがWebフォーム以外のどこかでそれを永続させるつもりなら、それを理解しています。確かにリストビューを処理するためではありません。

EDIT#2:

loggerlistView.Itemsタイプの "System.Collections.Generic.IList" であり、それは説明hereとして "ToListメソッド" と呼ばれる方法を有しています。

Linqへの参照を追加してみませんか?私はこれが.NET 3.5固有のものであることを今まで理解できませんでした。混乱して申し訳ありません。それを行うための私の方法ザッツ

using System.Linq; 
+1

これで私を失ってしまったので、ListView.Itemsの.ToList(intellisenseリスト)が表示されません。したがって、私のためにコンパイルされません。もっと説明できますか? – IbrarMumtaz

4
foreach (ListViewItem itemRow in this.ListView.Items) 
    {    
     for (int i = 0; i < itemRow.SubItems.Count; i++) 
     { 
      // Do something useful here ! 
      // e.g 'itemRow.SubItems[count]' <-- Should give you direct access to 
      // the item located at co-ordinates(0,0). Once you got it, do something 
      // with it. 
     } 
    } 

+0

ひどく凝縮されています。 – IbrarMumtaz

+0

なぜサブアイテムもforeachしないのはなぜですか? foreach(itemRow.SubItems内のListViewItem.ListViewSubItemサブアイテム){...} – Grammarian

+0

ダンノー、それも=で動作するはずです。 – IbrarMumtaz

0

は、.NET 3.5をお持ちの場合は、上記表示し何をすべきかIMO別の、より簡単な方法は、私はメソッドの戻り値の型としてのIEnumerableを使用して、それぞれを返すために、「降伏リターンを」使用することをお勧め

var qry = from i in listView1.Items.Cast<ListViewItem>() 
      from si in i.SubItems.Cast<System.Windows.Forms.ListViewItem.ListViewSubItem>() 
      select si.Text; 
関連する問題