C# 获取单个列表视图SelectedItem

C# 获取单个列表视图SelectedItem,c#,winforms,listviewitem,C#,Winforms,Listviewitem,我将listView的MultiSelect属性设置为false,并尝试获取单个listViewItem。但是可用的属性是SelectedItems。我一直在使用以下代码 foreach (ListViewItem item in listView1.SelectedItems) { //do something with item.text or whatever } 因为我知道只会选择一个项目。正确的方法是什么?通常SelectedItems返回集合、数组或IQueryable 无

我将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; 
顺便说一下,您可以将要查看的项目保存到变量中,并在设置断点后在局部变量中检查其结构。

我这样做:

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

有时只使用下面的一行会给我带来一个例外

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 void listView1\u SelectedIndexChanged(对象发送方,事件参数e)
{ 
如果(listView1.SelectedIndices.Count=0)
{
String text=listView1.Items[intselectedindex].text;
//做点什么
//MessageBox.Show(listView1.Items[intselectedindex].Text);
} 
}

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

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);
    }
}
因此:


ListView
界面有点垃圾,所以我通常会发现helper类增长得很快。

对于购物车的情况,我推荐以下内容。我要把它分解成最简单的形式

假设我们从这个开始(一个包含2个列、2个按钮和一个标签的列表视图):

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

private void button2_Click(object sender, EventArgs e)
{
    listView1.Items.Remove(listView1.SelectedItems[0]);
    label1.Text = updateCartTotal().ToString();
}
现在,第二行正在使用下一个函数更新我们的标签总数,我将发布该函数,将listview中第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列中的所有项(子项[1].Text)。将其添加到我们在foreach循环之前声明的十进制中,以保持总数。如果您想纳税,您可以采取以下措施:

return runningTotal * 1.15;
或者不管你的税率是多少


总之,使用此函数,您可以通过调用函数来重新汇总listview。你可以像我之前的演示一样更改标签文本,如果你想更改的话。

以上答案中没有一个,至少对我来说,显示了如何实际处理确定你有1个项目还是多个项目,以及如何以通用方式从项目中实际获取值,而不依赖于实际上只有一个或多个项目,所以我要把我的帽子扔进拳击场

通过检查您的计数以确定您至少有一个项目,然后在
上执行
foreach
循环,可以非常轻松地完成此操作。选择editems
,将每个项目转换为
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
     }
}

这将工作,无论你有一个或多个项目。有趣的是,使用
ListView.SelectedListViewItemCollection
捕获
listView1.SelectedItems
并迭代,但我发现我的WPF应用程序中出现了一个错误:
类型“ListView”中不存在类型名称“SelectedListViewItemCollection”

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

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

如果要选择单个listview项目,请尝试此操作

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)
            {

            }



        }

别忘了检查listView1.SelectedItems.Count以防止出现空指针异常我真的不确定这是否有帮助,您在哪里回答了不同的问题?仅供参考-您未检查所选项目的使用情况,因此在控件中单击时,如果未选择任何项目,则会引发异常。
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();            
    }
}
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)
            {

            }



        }