19

listViewのMultiSelectプロパティを false に設定しており、単一の listViewItem を取得しようとしています。しかし、利用可能なプロパティはSelectedItems. 私は次のコードを使用しています...

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

選択される項目は 1 つだけであることを知っているからです。これを行う正しい方法は何ですか?

4

9 に答える 9

35

通常SelectedItems、コレクション、配列、またはIQueryable.

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

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

ちなみに、見たい項目を変数に保存して、ブレークポイントを設定してローカルで構造を確認することもできます。

于 2013-02-26T14:23:34.787 に答える
18

私はこれをそのようにします:

if (listView1.SelectedItems.Count > 0)
{
     var item = listView1.SelectedItems[0];
     //rest of your logic
}
于 2013-02-26T14:23:59.453 に答える
4

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

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); 
    } 
}
于 2014-10-23T10:49:56.000 に答える
1

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

これ (2 つの列、2 つのボタン、およびラベルを含むリスト ビュー) から始めると仮定します。 起動

まず、アイテムを削除します。これを行うには、削除ボタンを入力します。

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 ループの前に宣言した 10 進数に加算して、合計を保持します。税金をやりたい場合は、次のようにすることができます。

return runningTotal * 1.15;

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

要するに、この関数を使用すると、関数を呼び出すだけでリストビューを再集計できます。それがあなたの求めているものである場合は、以前にデモしたようにラベルのテキストを変更できます。

于 2016-08-24T08:28:39.303 に答える
0

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

これは、カウントをチェックして少なくとも 1 つのアイテムがあることを確認し、次に でforeachループを実行して.SelectedItems、各アイテムを としてキャストすることによって、非常に簡単かつ一般的に行われ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'.

于 2016-11-14T14:46:37.950 に答える
0

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

foreach (ListViewItem item in listView1.SelectedItems)
{
    int index = item.Index;
    //index is now zero based index of selected item
}
于 2018-09-01T11:01:25.113 に答える