我将listView的MultiSelect
属性设置为false,现在我想获取单个listViewItem。但是可用的属性是SelectedItems
。我一直在使用以下代码...
foreach (ListViewItem item in listView1.SelectedItems)
{
//do something with item.text or whatever
}
因为我知道只会选择一个项目。正确的做法是什么?
我将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);
}
}
如果只是一个简单的应用程序,其中只有一两个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();
}
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;
当鼠标点击时,我会这样做:
public static string GetSelectedItem(ListView list)
{
foreach (ListViewItem item in list.Items)
{
if (item.Selected)
return item.Text;
}
return null;
}
这适用于单选和多选列表:
foreach (ListViewItem item in listView1.SelectedItems)
{
int index = item.Index;
//index is now zero based index of selected item
}
以上的答案都没有向我展示如何实际处理确定您是否有一个项目或多个项目,以及如何以一种通用的方式获取项目的值,而不依赖于实际上只有一个项目或多个项目,因此我也来发表我的看法。
这可以通过检查计数以确保您至少有一个项目,然后在.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
}
}
ListView.SelectedListViewItemCollection
来捕获listView1.SelectedItems
并进行迭代,但我发现这在我的WPF应用中会导致错误:类型名称“SelectedListViewItemCollection”在类型“ListView”中不存在
。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)
{
}
}