2013-02-26 384 views
10

我必须设置为false列表视图的MultiSelect财产,我试图让一个单一的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和设置后检查其结构当地人的项目断点。

+1

不要忘记检查listView1.SelectedItems.Count以防止出现空指针异常 – 2016-09-19 06:33:25

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

如果它只是一个natty小应用程序与一个或两个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控件界面有点垃圾,所以我通常会找到帮手类增长得相当快

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列的列表视图:

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项或多项,以及如何以不依赖于通用方式从项目中实际获取值实际上只有一个项目,或多个,所以我把我的帽子扔在戒指。

这是很容易和一般做通过检查你的计一看就知道至少有一个项目,然后做在.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 says使用ListView.SelectedListViewItemCollection来捕获listView1.SelectedItems并重复遍历,但是我发现这给了我的WPF应用程序中的错误:The type name 'SelectedListViewItemCollection' does not exist in type 'ListView'