2014-01-24 53 views
5

我一直在寻找大约一个小时,并且找不到最佳解决方案。 我正在从VB.NET迁移到C#Forms和C#WPF。 没关系...... 所以我用这个代码为C#的形式和它的工作原理,但不是在C#WPF获取在ListView中选择的物品的索引

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

这是我想获得该项目的索引列表框中单击的方式。 我有错误。选中

请帮忙。

回答

13

您可以从listView中获得SelectedIndex。无需遍历所有项目,因为根据您的代码,您似乎对任何选定项目的索引感兴趣。

var2 = ListView1.SelectedIndex; 

OR

只是这工作,如果感兴趣的只是第一个索引:

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

嘿!谢谢!!!我会尝试你的两个解决方案。谢谢谢谢谢谢! – Glenn

1

对于Visual Studio 2015年,SelectedIndex似乎并不可用。相反,你可以使用SelectedIndices[x]其中x=0会给你第一个选择项:

listView.SelectedIndices[0] 

您还可以将MultipleSelect属性设置为false,只允许在同一时间要选择一个项目。

+0

它在WPF中可用,这是一个WPF问题。也许你在使用winforms。 –

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事件中使用它,就没有问题,因为如果没有项目,它将不会被触发。 这是由DesignIndexChanged事件触发两次而设计的。一旦取消选择初始项目,然后选择新项目。 正确的方法是返回-1并检查负数。 这也是为什么这里有人得到和ArgumentOutOfRange异常。

+0

这是一个WPF问题,而不是一个winforms问题。 [WPF ListView控件继承SelectedIndex表单选择器](https://msdn.microsoft.com/en-us/library/system.windows.controls.primitives.selector.selectedindex(v = vs.110).aspx)。很有可能有人试图在winforms中做同样的事情,最终可能会在这里找到答案,但至少应该在答案中记下这个区别。 –

1

如果您使用.NET Compact Framework,则不支持SelectedIndex。对于一般的解决方案,我更喜欢SelectedIndices

ListView.SelectedIndexCollection indices = lst.SelectedIndices; 
if (indices.Count > 0) 
{ 
    // Do something with indices[0] 
} 
+0

这是一个非常古老的问题。我已经选择了一个答案。当我发布时,我还是一名学生。 :)现在我是一个iOS开发人员哈哈。 – Glenn

+0

很酷,恭喜!通过网络搜索找到您的问题,并认为有关.NET Compact Framework的详细信息可能会引起其他开发人员的兴趣... – AlainD

0

它可以返回NULL。此外,SelectedIndexChanged事件可以是FIRED TWICE。第一次,还没有选择。

所以,唯一安全的方式来发现它是这样的:

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

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

0

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(); 
相关问题