获取单个listView SelectedItem

我将listView的MultiSelect属性设置为false,并且我正在尝试获取单个listViewItem。 但可用属性是SelectedItems 。 我一直在使用以下代码……

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

因为我知道只会选择一个项目。 这样做的正确方法是什么?

通常, SelectedItems返回集合,数组或IQueryable

无论哪种方式,您都可以通过索引访问项目与数组:

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

顺便说一句,您可以随时将要查看的项目保存到var lookat = whatever you want并在设置断点后在Locals中检查其结构。

我这样做:

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

有时仅使用下面的行会抛出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); } } 

如果它只是一个带有一个或两个列表视图的小应用程序,我通常会创建一个小帮助属性:

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

如果我有负载,那么将它移到lil’辅助类:

 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接口有点垃圾,所以我通常会发现帮助程序类增长很快

对于购物车情况,这是我推荐的。 我要把它分解成最简单的forms。

假设我们从这开始(带有2个列,2个按钮和标签的列表视图): 开始

首先,删除项目,为此我们将输入我们的删除按钮:

 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; 

或者你的税率是多少。

它的长短,使用此function,您只需调用该函数即可重新调整列表视图。 您可以更改标签文本,就像我之前演示的那样,如果这就是您所追求的。

上面的答案,至少对我来说,都没有显示如何实际处理确定您是否有1个项目或多个项目,以及如何以一般方式从您的项目中实际获取值,而不依赖于实际只有一个项目,或多个,所以我把我的帽子扔进戒指。

通过检查您的计数以查看您至少有一个项目,然后在.SelectedItems上执行foreach循环,将每个项目转换为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'

这适用于单选和多选列表:

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