web-dev-qa-db-ja.com

ListViewで選択された項目のインデックスを取得します

私はすでに約1時間探していましたが、最良の解決策を見つけることができませんでした。 VB.NETからC#フォームおよびC#WPFに移行しています。気にしないでください...だから私はこのコードをC#フォームに使用しますが、C#WPFでは動作しません

 if (ListView1.SelectedItems.Count > 0)
            {
                for (lcount = 0; lcount <= ListView1.Items.Count - 1; lcount++)
                {
                    if (ListView1.Items[lcount].Selected == true)
                    {
                        var2 = lcount;
                        break;
                    }
                }
            }

これは、リストボックスでクリックされたアイテムのインデックスを取得する方法です。 .SELECTEDにエラーがあります

助けてください。

8
Glenn

ListViewからSelectedIndexを取得できます。コードごとに、選択した項目のインデックスに関心があるように見えるため、すべての項目を走査する必要はありません。

var2 = ListView1.SelectedIndex;

OR

最初のインデックスのみに関心がある場合、単にこれが機能します:

if (lst.SelectedItems.Count > 0)
{
    var2 = lst.Items.IndexOf(lst.SelectedItems[0]);
}
21
Rohit Vats

.NET Compact Frameworkを使用している場合、SelectedIndexはサポートされていません。一般的な解決策として、SelectedIndicesを好みます:

ListView.SelectedIndexCollection indices = lst.SelectedIndices;
if (indices.Count > 0)
{
    // Do something with indices[0]
}
5
AlainD

Visual Studio 2015では、SelectedIndexは利用できないようです。代わりに、SelectedIndices[x]を使用できます。x=0は、最初に選択されたアイテムを提供します。

listView.SelectedIndices[0]

MultipleSelectプロパティをfalseに設定して、一度に1つのアイテムのみを選択することもできます。

2

NULLを返すことができます。また、SelectedIndexChangedイベントはFIRED TWICEになります。そして初めて、まだ何も選択されていません。

したがって、それを見つける唯一の安全な方法は次のとおりです。

    private void lv1_SelectedIndexChanged(object sender, EventArgs e)
    {
        if (lv1.FocusedItem == null) return;
        int p = lv1.FocusedItem.Index;

...現在、int pの値は正しいです...

1
Roger Deep

sColl.Clear(); string item = String.Empty;

        if (listView1.SelectedItems.Count > 0)
        {
            for (int i = 0; i < listView1.SelectedItems.Count; i++)
            {
                if (listView1.SelectedItems[i].Selected)   
                {
                    int i2 = listView1.SelectedItems[i].Index;
                    item = listView1.Items[i2].Text;
                    sColl.Add(item);
                }
            }
        }

        listView1.SelectedItems.Clear();
        foreach (var itemS in sColl)
        {
            string items = itemS;
        }

        sColl.Clear();
        listView1.SelectedItems.Clear();
0

SelectedIndexを戻さないのはなぜですか?現在のネームスペースの後にこの拡張機能を追加します。

public static class Extension
{
    public static int SelectedIndex(this ListView listView)
    {
        if (listView.SelectedIndices.Count > 0)
            return listView.SelectedIndices[0];
        else
            return 0;
    }
}

このクラスをExtensionsという名前空間にカプセル化し、プロジェクトの名前空間内に追加して、拡張機能を使用します。

  using Extensions;

次に、このように使用します

   private void ListView1_SelectedIndexChanged(object sender, EventArgs e)
    {
        int selectionindex = ListView1.SelectedIndex();
        ListViewItem seletedItem = ListView1.Items[selectionindex];           
    }

追伸拡張メソッドはElseで-1を返す必要がありますが、SelectedIndexChangedイベントから使用している限り、アイテムがない場合は起動されないので問題ありません。 SelectedIndexChangedイベントが2回発生するため、これは仕様です。最初の項目の選択を解除してから、新しい項目を選択します。適切な方法は、-1を返し、負の数をチェックすることです。これが、ここで誰かがArgumentOutOfRange Exceptionを取得した理由でもあります。

0