我MultiSelect
将 listView 的属性设置为 false,并且我正在尝试获取单个 listViewItem。但是可用的属性是SelectedItems
. 我一直在使用以下代码...
foreach (ListViewItem item in listView1.SelectedItems)
{
//do something with item.text or whatever
}
因为我知道只会选择一项。这样做的正确方法是什么?
我MultiSelect
将 listView 的属性设置为 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);
}
}
如果它只是一个带有一两个的漂亮小应用程序,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
所以我通常发现帮助类增长得很快。
对于购物车情况,这是我推荐的。我要把它分解成最简单的形式。
假设我们从这个开始(一个包含 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;
或者不管你的税率是多少。
总而言之,使用此函数,您只需调用该函数即可重新汇总您的列表视图。如果这是您所追求的,您可以像我之前演示的那样更改标签文本。
至少对我来说,以上答案都没有显示如何实际处理确定您是否有 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'
.
这适用于单选列表和多选列表:
foreach (ListViewItem item in listView1.SelectedItems)
{
int index = item.Index;
//index is now zero based index of selected item
}
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)
{
}
}