获取单个listView选定项

20

我将listView的MultiSelect属性设置为false,现在我想获取单个listViewItem。但是可用的属性是SelectedItems。我一直在使用以下代码...

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

因为我知道只会选择一个项目。正确的做法是什么?
10个回答

39
通常情况下,SelectedItems 返回的是一个集合、数组或 IQueryable

无论哪种方式,您都可以像使用数组一样通过索引访问元素:

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

顺便提一下,您可以将要查看的项目保存到变量中,在设置断点后检查其结构。

4
别忘了检查listView1.SelectedItems.Count以避免空指针异常。 - Abraham Putra Prakasa

18
我这样做:
if (listView1.SelectedItems.Count > 0)
{
     var item = listView1.SelectedItems[0];
     //rest of your logic
}

6
有时仅使用下面的代码会抛出异常:
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); 
    } 
}

2

如果只是一个简单的应用程序,其中只有一两个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接口有点糟糕,所以我通常发现帮助类会很快增长。


1

对于购物车情况,这是我推荐的做法。我将把它分解为最简单的形式。

假设我们从这个开始(一个带有2列、2个按钮和一个标签的列表视图): 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;
}

你不必像我一样使用小数,如果没有小数,可以使用浮点数或整数。所以让我们来分解一下。我们使用一个for循环来计算第二列(SubItems[1].Text)中所有项目的总和。将其加到我们在foreach循环之前声明的一个decimal变量中以保持总数。如果你想做税收,可以做如下操作:

return runningTotal * 1.15;

或者你的税率是多少。使用此函数,您只需调用该函数即可重新计算列表视图。如果您需要更改标签文本,就像我之前演示的那样。请注意保留HTML标记。

我真的不确定这是否有帮助,您是在回答另一个问题吗?供参考 - 您没有对所选项目的使用进行检查,因此在未选择任何项目时单击控件会引发异常。 - Neil

0

当鼠标点击时,我会这样做:

    public static string GetSelectedItem(ListView list)
    {
        foreach (ListViewItem item in list.Items)
        {
            if (item.Selected)
                return item.Text;
        }
        return null;
    }

0

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

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

0

以上的答案都没有向我展示如何实际处理确定您是否有一个项目或多个项目,以及如何以一种通用的方式获取项目的值,而不依赖于实际上只有一个项目或多个项目,因此我也来发表我的看法。

这可以通过检查计数以确保您至少有一个项目,然后在.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
     }
}

无论你有一个还是多个项目,这将起作用。很有趣的是,MSDN建议使用ListView.SelectedListViewItemCollection来捕获listView1.SelectedItems并进行迭代,但我发现这在我的WPF应用中会导致错误:类型名称“SelectedListViewItemCollection”在类型“ListView”中不存在

0
foreach (ListViewItem itemRow in taskShowListView.Items)
{
    if (itemRow.Items[0].Checked == true)
    {
        int taskId = Convert.ToInt32(itemRow.SubItems[0].Text);

        string taskDate = itemRow.SubItems[1].ToString();
        string taskDescription = itemRow.SubItems[2].ToString();            
    }
}

0
如果您想在不单击鼠标的情况下选择单个列表视图项,请尝试以下方法。
private void timeTable_listView_MouseUp(object sender, MouseEventArgs e)
        {
            Point mousePos = timeTable_listView.PointToClient(Control.MousePosition);
            ListViewHitTestInfo hitTest = timeTable_listView.HitTest(mousePos);



            try
            {
            int columnIndex = hitTest.Item.SubItems.IndexOf(hitTest.SubItem);
            edit_textBox.Text = timeTable_listView.SelectedItems[0].SubItems[columnIndex].Text;
            }
            catch(Exception)
            {

            }



        }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接