it-swarm.com.ru

Получить индекс элемента, выбранного в ListView

Я искал около часа и не смог найти лучшего решения .. Я перехожу с VB.NET на C # Forms и на 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

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

var2 = ListView1.SelectedIndex;

OR

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

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

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

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

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

listView.SelectedIndices[0]

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

2
Luis Conejo-Alpizar

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

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

    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
Claudio.Marcandalli

Почему бы не вернуть 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];           
    }

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

0
Claudiu Octavian