【问题标题】:Using loops to get at each item in a ListView?使用循环获取 ListView 中的每个项目?
【发布时间】:2009-08-27 21:38:56
【问题描述】:

使用循环获取多列 ListView 中的每个项目的好方法是什么?

在做了相当多的挖掘之后,我真的找不到任何东西,所以当我找到一些东西时,我想在这里分享它,看看人们是否有更好的方法来做这件事。也有点像抢占一个肯定会出现的问题,因为我正在挠头想怎么办???呃……我?

我喜欢这个网站,所以我想分享我对上述问题的解决方案。我知道有点倒退,但我知道它会在某个地方帮助某人。 = )

    private ArrayList getItemsFromListViewControl()
    {                      
        ArrayList lviItemsArrayList = new ArrayList();

        foreach (ListViewItem itemRow in this.loggerlistView.Items)
        {
            //lviItemsArrayList.Add(itemRow.Text); <-- Already included in SubItems so ... = )

            for (int i = 0; i < itemRow.SubItems.Count; i++)
            {
                lviItemsArrayList.Add(itemRow.SubItems[i].Text);
                // Do something useful here, for example the line above.
            }
        }
        return lviItemsArrayList;
    }

这将返回一个基于线性数组的表示,所有项目都属于 ArrayList 集合对象中的目标 ListView 控件。

【问题讨论】:

  • 将数据复制到ArrayList 与直接遍历Items 相比有什么优势?
  • 您应该先提出问题,然后自己回答,然后将其标记为已接受,(当然要写下一行的答案,然后复制并粘贴),然后才有机会回答。
  • 是的,你是对的。在示例中,我确实直接遍历了这些项目,但我将 ArrayList 对象保存在其他地方,因此我需要一个 ArrayList 对象,该对象可以是任何大小,具体取决于我的 ListView 中给定的行数。所以我需要处理 ListView 中每个项目的值,然后将我的结果提供给我的应用程序的另一部分。一个arraylist让我可以实现。因为它允许集合在循环遇到列表中的新行时动态增长。

标签: c# winforms listview loops


【解决方案1】:

我建议使用 IEnumerable 作为方法的返回类型,并使用“yield return”来返回每个子项。

private IEnumerable<ListViewSubItem> GetItemsFromListViewControl()
{                      
    foreach (ListViewItem itemRow in this.loggerlistView.Items)
    {            
        for (int i = 0; i < itemRow.SubItems.Count; i++)
        {
            yield return itemRow.SubItems[i]);
        }
    }
}

虽然如果您使用的是 .NET 3.5,我建议您也使用 LINQ。

【讨论】:

  • 这是一种很好的做法,而且看起来也很专业,我对这个还是有点不满意,你介意解释一下这个返回类型是如何工作的吗? TIA
【解决方案2】:
    foreach (ListViewItem itemRow in this.ListView.Items)
    {            
        for (int i = 0; i < itemRow.SubItems.Count; i++)
        {
            // Do something useful here !
            // e.g 'itemRow.SubItems[count]' <-- Should give you direct access to
            // the item located at co-ordinates(0,0). Once you got it, do something 
            // with it.
        }
    }

这就是我的做法。

【讨论】:

  • 为什么不只 foreach 子项呢? foreach (ListViewItem.ListViewSubItem subItem in itemRow.SubItems) {...}
【解决方案3】:

如果您有 .NET 3.5,那么执行上述操作的另一种 IMO 更简单的方法是

  var qry = from i in listView1.Items.Cast<ListViewItem>()
            from si in i.SubItems.Cast<System.Windows.Forms.ListViewItem.ListViewSubItem>()
            select si.Text;

【讨论】:

    【解决方案4】:

    我使用它来使用 foreach 从列表视图中提取一行或多行:

    首先我将列表视图连接到一个事件:

        private void generic_KeyDown(object sender, KeyEventArgs e)
        {
            ListView gListBox = (ListView)sender;
    
            if (e.Control && e.KeyCode == Keys.C)
            {
                CopyListViewBox(gListBox);
            }
        }
    

    然后我得到选中的数据:

        public void CopyListViewBox(ListView list)
        {
    
            StringBuilder sb = new StringBuilder();
            foreach (ListViewItem item in list.SelectedItems)
            {
                string line = "";
                foreach(ListViewItem.ListViewSubItem element in item.SubItems)
                {
                    line += element.Text + "\t";
                }
                sb.AppendLine(line);
            }
    
            Clipboard.SetDataObject(sb.ToString());
    
        }
    

    【讨论】:

      【解决方案5】:

      我没有时间用代码对此进行测试,但也许您可以使用 listview 方法之一返回的集合来初始化数组列表?回家后我会检查一下,如果在此之前没有回答问题,我会发表评论。

      编辑:我对此进行了真正的快速检查,它使用我放入列表视图中的一个元素编译、运行和初始化了数组列表。

      ArrayList lviItemsArrayList = new ArrayList(loggerlistView.Items.ToList());
      

      试一试,让我们知道它是否有效……不过,我同意其他评论。我认为将其转换为数组列表的唯一原因是您是否要将其保留在 Web 表单以外的其他地方。当然不是用于处理列表视图。

      编辑#2:

      loggerlistView.Items 属于“System.Collections.Generic.IList”类型,并且有一个名为“ToList”的方法,如here 所述。

      尝试添加对 Linq 的引用?直到现在我才意识到这是特定于 .NET 3.5 的 - 很抱歉造成混淆。

      using System.Linq;
      

      【讨论】:

      • 你在这个上迷路了,我在 ListView.Items 上看不到 .ToList() 的任何智能感知列表 --> 因此不会为我编译。你能进一步解释一下吗?
      • 同理,答案错误,没有.ToList()方法可用。
      猜你喜欢
      • 1970-01-01
      • 2021-12-11
      • 2019-03-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-02-09
      相关资源
      最近更新 更多