Получить одиночный 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
}