Получить индекс элемента в ListView

Я искал уже около часа и не мог найти лучшее решение. Я мигрирую из 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;
                    }
                }
            }

именно так я хочу получить индекс элемента, щелкнутого в listbox. У меня есть ошибка .Выбрано

пожалуйста, помогите.

6 ответов


вы можете узнать SelectedIndex из listView. Нет необходимости пересекать все элементы, потому что в соответствии с вашим кодом вас интересует индекс любого выбранного элемента.

var2 = ListView1.SelectedIndex;

или

просто это будет работать, если интересует только первый индекс:

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

Если вы используете .NET Compact Framework,SelectedIndex Не поддерживается. Для общего решения, я предпочитаю SelectedIndices:

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

Для Visual Studio 2015,SelectedIndex Кажется, недоступно. Вместо этого, вы можете использовать SelectedIndices[x] здесь x=0 даст вам первый выбранный элемент:

listView.SelectedIndices[0]

вы также можете установить MultipleSelect свойство false разрешить выбор только одного элемента за раз.


Он может возвращать NULL. Также событие SelectedIndexChanged можно запустить дважды. А в первый раз еще ничего не выбрали.

таким образом, единственный безопасный способ найти его таков:

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

... теперь int p имеет правильное значение...


почему бы не вернуть 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, а затем добавьте его в пространство имен projects для использования расширения.

  using Extensions;

тогда просто используйте вот так

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

С. П. Метод расширения должен был вернуть -1 на Else, но пока вы используете его из события SelectedIndexChanged, вы в порядке, так как он не будет уволен, если нет никаких предметов. Это по дизайну, так как событие SelectedIndexChanged запускается дважды. Один раз, чтобы отменить выбор исходного элемента, а затем выбрать новый. Правильный способ-вернуть -1 и проверить отрицательное число. Вот почему кто-то здесь получил и исключение ArgumentOutOfRange.


sColl.Четкий(); string item = строка.Пусто;

        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();