2013-02-26 6 views
10

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

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

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

ответ

16

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

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

String text = listView1.SelectedItems[0].Text; 
//do something 

Кстати, вы всегда можете сохранить элемент, который вы хотите посмотреть на в var lookat = whatever you want и проверить свою структуру в Locals после установки точки останова.

+1

Не забудьте проверить listView1.SelectedItems.Count, чтобы исключить исключение нулевого указателя –

8

Я делаю это так:

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

Иногда использование только ниже линии бросает мне исключение,

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

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

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

0

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

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

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

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

Теперь вторая линия обновляет наши этикетки всего с помощью следующей функции я буду размещать в addup всю сумму столбца 2 в ListView:

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; 

или какая бы ваша ставка налога не взималась.

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

0

Ни один из ответов выше, по крайней мере для меня, не показывает, как на самом деле обрабатывать определение того, есть ли у вас 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 says использовать ListView.SelectedListViewItemCollection для захвата listView1.SelectedItems и повторить это, но я обнаружил, что это дало ошибку в моем приложении WPF: The type name 'SelectedListViewItemCollection' does not exist in type 'ListView'.

Смежные вопросы