Получить одиночный listView SelectedItem

У меня есть свойство MultiSelect для набора listView равным false, и я пытаюсь получить один listViewItem. Но доступное свойство SelectedItems. Я использовал следующий код...

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

Потому что я знаю, что будет выбран только один элемент. Каков правильный способ сделать это?

Ответ 1

Обычно SelectedItems возвращает либо коллекцию, массив или IQueryable.

В любом случае вы можете получить доступ к элементам через индекс, как с массивом:

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

Кстати, вы можете сохранить элемент, на который хотите посмотреть, в переменную, и проверить его структуру в локальных системах после установки точки останова.

Ответ 2

Я так делаю:

if (listView1.SelectedItems.Count > 0)
{
     var item = listView1.SelectedItems[0];
     //rest of your logic
}

Ответ 3

Иногда использование только строки ниже вызывает меня Exception,

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

Ответ 4

Если это просто изящное маленькое приложение с одним или двумя ListViews я обычно просто создаю небольшое вспомогательное свойство:

private ListViewItem SelectedItem { get { return (listView1.SelectedItems.Count > 0 ? listView1.SelectedItems[0] : null); } }

Если у меня есть нагрузки, то перенесите их в вспомогательный класс:

internal static class ListViewEx
{
    internal static ListViewItem GetSelectedItem(this ListView listView1)
    {
        return (listView1.SelectedItems.Count > 0 ? listView1.SelectedItems[0] : null);
    }
}

так:

ListViewItem item = lstFixtures.GetSelectedItem();

Интерфейс ListView немного мусор, поэтому обычно я считаю, что вспомогательный класс растет довольно быстро.

Ответ 5

Для ситуации в корзине, где я рекомендую. Я собираюсь разбить его на простую форму.

Предполагая, что мы начнем с этого (просмотр списка с двумя колонками, двумя кнопками и меткой): starting

Прежде всего, удалив элементы, чтобы сделать это, мы введем нашу кнопку удаления:

private void button2_Click(object sender, EventArgs e)
{
    listView1.Items.Remove(listView1.SelectedItems[0]);
    label1.Text = updateCartTotal().ToString();
}

Теперь вторая строка обновляет наши метки, используя следующую функцию, которую я опубликую, чтобы добавить все общее число столбца 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, чтобы сохранить итоговое значение. Если вы хотите сделать налог, вы можете сделать что-то вроде:

return runningTotal * 1.15;

или независимо от вашей налоговой ставки.

Длинные и короткие, используя эту функцию, вы можете восстановить свой список, просто вызвав функцию. Вы можете изменить текст меток, как показано выше, если это то, что вам нужно.

Ответ 6

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

Ответ 7

Это работает как для одного, так и для нескольких списков выбора:

foreach (ListViewItem item in listView1.SelectedItems)
{
    int index = ListViewItem.Index;
    //index is now zero based index of selected item
}