2014-01-24 4 views
5

Я искал уже около часа и не нашел лучшего решения. Я переношу с VB.NET на C# Forms и на C# WPF. Ничего, что ... поэтому я использую этот код для форм C#, и она работает, но не в C# WPFПолучить индекс элемента, выбранного в ListView

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

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

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

ответ

13

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

var2 = ListView1.SelectedIndex; 

ИЛИ

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

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

Привет! благодаря!!! Я попробую оба ваших решения. Благодарю! – Glenn

1

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

listView.SelectedIndices[0] 

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

+0

Он доступен в WPF, и это вопрос WPF. Возможно, вы в winforms. –

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; 
    } 
} 

Encapsulate этот класс в пространстве имен расширений, а затем добавить это в пространстве имен проектов использовать расширение.

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

Это вопрос WPF, а не вопрос winforms. [Элемент управления ListView WPF наследует Selecto Select Select] (https://msdn.microsoft.com/en-us/library/system.windows.controls.primitives.selector.selectedindex (v = vs.110) .aspx). Вполне возможно, что кто-то, пытающийся сделать то же самое в winforms, может оказаться здесь и найти ваш ответ полезным, но вы должны хотя бы обратить внимание на различие в вашем ответе. –

1

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

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

Это очень старый квест. Я уже выбрал ответ. Тогда я был студентом, когда я разместил это. :) И теперь я - разработчик iOS для разработчиков. – Glenn

+0

Прохладный, поздравляю! Нашел ваш вопрос через веб-поиск и подумал, что информация о .NET Compact Framework может представлять интерес для других разработчиков ... – AlainD

0

Он может вернуть NULL. Также событие SelectedIndexChanged может быть ОБРАТНО В ДВАЖДЫ. И в первый раз пока ничего не выбрано.

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

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

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

0

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(); 
Смежные вопросы