web-dev-qa-db-ja.com

単一のlistView SelectedItemを取得します

ListViewのMultiSelectプロパティをfalseに設定しており、1つのlistViewItemを取得しようとしています。ただし、使用可能なプロパティはSelectedItemsです。私は次のコードを使用しています...

foreach (ListViewItem item in listView1.SelectedItems)
{
    //do something with item.text or whatever
}

なぜなら、選択されるアイテムは1つだけだからです。これを行う正しい方法は何ですか?

12
topofsteel

通常、SelectedItemsは、コレクション、配列、またはIQueryableのいずれかを返します。

いずれの方法でも、配列と同様にインデックスを介してアイテムにアクセスできます。

String text = listView1.SelectedItems[0].Text; 

ところで、見たい項目を変数に保存し、ブレークポイントを設定した後、ローカルでその構造を確認できます。

25
Vogel612

私はこれを次のように行います:

if (listView1.SelectedItems.Count > 0)
{
     var item = listView1.SelectedItems[0];
     //rest of your logic
}
10
gzaxx

下の行のみを使用すると例外がスローされることがありますが、

String text = listView1.SelectedItems[0].Text; 

以下のコードを使用します。

private void listView1_SelectedIndexChanged(object sender, EventArgs e) 
{ 
    if (listView1.SelectedIndices.Count <= 0) 
    { 
        return; 
    } 
    int intselectedindex = listView1.SelectedIndices[0]; 
    if (intselectedindex >= 0) 
    {
        String text = listView1.Items[intselectedindex].Text;

        //do something
        //MessageBox.Show(listView1.Items[intselectedindex].Text); 
    } 
}
4
Pedro Loureiro

1つまたは2つのListViewsを備えた単なるちょっとしたアプリの場合、通常は小さなヘルパープロパティを作成します。

private ListViewItem SelectedItem { get { return (listView1.SelectedItems.Count > 0 ? listView1.SelectedItems[0] : null); } }

ロードがある場合は、ヘルパークラスに移動します。

internal static class ListViewEx
{
    internal static ListViewItem GetSelectedItem(this ListView listView1)
    {
        return (listView1.SelectedItems.Count > 0 ? listView1.SelectedItems[0] : null);
    }
}

そう:

ListViewItem item = lstFixtures.GetSelectedItem();

ListViewインターフェースは少しごみですので、通常、ヘルパークラスは非常に急速に成長します。

1
Vman

上記の回答はどれも、少なくとも私には、1つのアイテムまたは複数のアイテムがあるかどうかの判断を実際に処理する方法と、実際に存在することに依存しない一般的な方法でアイテムから値を実際に取得する方法を示していません1つまたは複数のアイテムなので、リングに帽子を投げます。

これは、カウントをチェックして少なくとも1つのアイテムがあることを確認し、.SelectedItemsforeachループを実行し、各アイテムをDataRowViewとしてキャストすることにより、非常に簡単かつ一般的に行われます。

if (listView1.SelectedItems.Count > 0)
{
     foreach (DataRowView drv in listView1.SelectedItems)
     {
         string firstColumn = drv.Row[0] != null ? drv.Row[0].ToString() : String.Empty;
         string secondColumn = drv.Row[1] != null ? drv.Row[1].ToString() : String.Empty;
         // ... do something with these values before they are replaced
         // by the next run of the loop that will get the next row
     }
}

これは、アイテムが1つであっても複数であっても機能します。 MSDNによるとListView.SelectedListViewItemCollectionを使用してlistView1.SelectedItemsをキャプチャし、それを反復処理するのは面白いことですが、WPFアプリでエラーが発生したことがわかりました:The type name 'SelectedListViewItemCollection' does not exist in type 'ListView'

0
vapcguy

ショッピングカートの状況については、こちらがお勧めです。これを最も単純な形式に分解します。

これから始めると仮定します(2つの列、2つのボタン、およびラベルのあるリストビュー): starting

まず最初に、アイテムを削除するために、削除ボタンを入力します。

private void button2_Click(object sender, EventArgs e)
{
    listView1.Items.Remove(listView1.SelectedItems[0]);
    label1.Text = updateCartTotal().ToString();
}

2行目は、リストビューの列2の合計を合計するために投稿する次の関数を使用して、ラベルの合計を更新しています。

private decimal updateCartTotal()
{
    decimal runningTotal = 0;
    foreach(ListViewItem l in listView1.Items)
    {
        runningTotal += Convert.ToDecimal(l.SubItems[1].Text);
    }
    return runningTotal;
}

私のように小数を使用する必要はありません。小数がない場合は、floatまたはintを使用できます。それでは分解しましょう。 forループを使用して、列2(SubItems [1] .Text)のすべてのアイテムを合計します。これをforeachループの前に宣言した小数に追加して、合計を保持します。税金を払いたい場合は、次のようなことができます。

return runningTotal * 1.15;

またはあなたの税率が何であれ。

長くも短くも、この関数を使用すると、関数を呼び出すだけでリストビューを再集計できます。それがあなたが後のものであるならば、あなたは私が前にデモしたようにラベルテキストを変えることができます。

0
Lulceltech

これは、単一および複数の選択リストで機能します。

foreach (ListViewItem item in listView1.SelectedItems)
{
    int index = ListViewItem.Index;
    //index is now zero based index of selected item
}
0
Nikola