【问题标题】:Get the index of Item selected in ListView获取ListView中选中的Item的索引
【发布时间】:2014-01-24 08:35:24
【问题描述】:

我已经搜索了大约一个小时,但找不到最佳解决方案。 我正在从 VB.NET 迁移到 C# Forms 和 C# WPF。 不要管那个... 所以我将此代码用于 C# 表单并且它可以工作,但不能在 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 中有错误

请帮忙。

【问题讨论】:

    标签: c# wpf listview indexing


    【解决方案1】:

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

    var2 = ListView1.SelectedIndex;
    

    如果只对第一个索引感兴趣,这将起作用:

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

      • 这是一个非常古老的问题。我已经选择了一个答案。发这个帖子的时候,我还是个学生。 :) 现在我是一名 iOS 开发人员,哈哈。
      • 酷,恭喜!通过网络搜索找到了您的问题,并认为其他开发人员可能会对有关 .NET Compact Framework 的详细信息...
      • if (indices.Count = 1) 否则,您必须循环处理集合!我们在子元素中的数据可以在这里找到lst.SelectedItems[0].SubItems[0].Text
      【解决方案3】:

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

      listView.SelectedIndices[0]
      

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

      【讨论】:

      • 它在 WPF 中可用,这是一个 WPF 问题。也许你在 winforms 中。
      【解决方案4】:

      它可以返回 NULL。 SelectedIndexChanged 事件也可以被触发两次。第一次,还没有选择任何内容。

      所以找到它的唯一安全方法是这样的:

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

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

      【讨论】:

        【解决方案5】:
        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();
        

        【讨论】:

          【解决方案6】:

          为什么不带回 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 Exception 的原因。

          【讨论】:

          • 这是一个 WPF 问题,而不是一个 winforms 问题。 The WPF ListView control inherits SelectedIndex form Selector。很有可能有人试图在 winforms 中做同样的事情,最终可能会在这里发现你的答案很有用,但你至少应该在你的答案中记下区别。
          • 由于 SelectedIndex 的约定是在未选择任何内容时返回 -1,或者返回所选项目的索引,因此没有表示选择多个项目的有效值,因此将其删除。跨度>
          猜你喜欢
          • 1970-01-01
          • 2014-05-23
          • 2017-02-23
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-04-22
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多