在ListView中获取所选项的索引

12

我已经搜索了一个小时,仍然找不到最好的解决方案。 我正在从VB.NET迁移到C# Forms和C# WPF。 不用在意这个... 所以我在C# forms中使用这段代码是有效的,但在C# WPF中却无效。

 if (ListView1.SelectedItems.Count > 0)
            {
                for (lcount = 0; lcount <= ListView1.Items.Count - 1; lcount++)
                {
                    if (ListView1.Items[lcount].Selected == true)
                    {
                        var2 = lcount;
                        break;
                    }
                }
            }

我想获取在列表框中被点击项目的索引,但我遇到了.SELECTED的错误。

请帮忙解决。

6个回答

24

你可以从listView中获取SelectedIndex。不需要遍历所有项,因为根据你的代码,你似乎只对所选项的索引感兴趣。

var2 = ListView1.SelectedIndex;

或者

如果只对第一个索引感兴趣,那么可以简单地使用这个方法:

if (lst.SelectedItems.Count > 0)
{
    var2 = lst.Items.IndexOf(lst.SelectedItems[0]);
}

8
如果您正在使用.NET Compact Framework,则不支持SelectedIndex。对于通用解决方案,我更喜欢SelectedIndices
ListView.SelectedIndexCollection indices = lst.SelectedIndices;
if (indices.Count > 0)
{
    // Do something with indices[0]
}

5

对于 Visual Studio 2015,SelectedIndex 似乎不可用。相反,您可以使用 SelectedIndices[x],其中 x=0 将为您提供第一个选定的项目:

listView.SelectedIndices[0]

您还可以将MultipleSelect属性设置为false,以仅允许一次选择一个项目。


它可用于WPF,这是一个关于WPF的问题。也许你在WinForms中。 - 15ee8f99-57ff-4f92-890c-b56153

4

它可能返回NULL。而且SelectedIndexChanged事件可能会触发两次。第一次时,还没有任何选项被选择。

因此,找到它的唯一安全方法是这样的:

    private void lv1_SelectedIndexChanged(object sender, EventArgs e)
    {
        if (lv1.FocusedItem == null) return;
        int p = lv1.FocusedItem.Index;

...现在int p具有正确的值...


2
sColl.Clear();
string item = String.Empty;

if (listView1.SelectedItems.Count > 0) {
    for (int i = 0; i < listView1.SelectedItems.Count; i++) {
        if (listView1.SelectedItems[i].Selected) {
            int i2 = listView1.SelectedItems[i].Index;
            item = listView1.Items[i2].Text;
            sColl.Add(item);
        }
    }
}

listView1.SelectedItems.Clear();
foreach (var itemS in sColl)
{
    string items = itemS;
}
 sColl.Clear();
listView1.SelectedItems.Clear();

0
为什么不把SelectedIndex带回来呢?在你当前的命名空间后添加这个扩展。
public static class Extension
{
    public static int SelectedIndex(this ListView listView)
    {
        if (listView.SelectedIndices.Count > 0)
            return listView.SelectedIndices[0];
        else
            return 0;
    }
}

将这个类封装在名为“Extensions”的命名空间中,然后将其添加到您的项目命名空间中以使用该扩展。

  using Extensions;

然后就可以像这样使用

   private void ListView1_SelectedIndexChanged(object sender, EventArgs e)
    {
        int selectionindex = ListView1.SelectedIndex();
        ListViewItem seletedItem = ListView1.Items[selectionindex];           
    }

附言: 扩展方法应该在 Else 上返回 -1,但只要您从 SelectedIndexChanged 事件中使用它,如果没有项目,则不会触发,因此您可以放心使用。 这是设计如此,因为 SelectedIndexChanged 事件会触发两次。一次是取消选择初始项,然后选择新项。 正确的方法是返回 -1 并检查负数。 这也是为什么有人在这里遇到了 ArgumentOutOfRange 异常。


1
这是一个WPF问题,而不是winforms问题。 WPF ListView控件从Selector继承SelectedIndex。有可能会有人尝试在winforms中做同样的事情并在此处找到您的答案有用,但您至少应该在您的答案中指出区别。 - 15ee8f99-57ff-4f92-890c-b56153
由于SelectedIndex的约定是如果没有选择任何内容则返回-1,或者返回所选项目的索引,因此没有有效值表示选择了多个项目,因此需要将其删除。 - dynamichael

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