Winform中如何获取ListView可视区域内的所有Item?

解决方案 »

  1.   

    你可以根据你的listview所在的坐标计算出item存在的范围,然后用getItemAt(x, y);就可以知道鼠标可以扫过的item了,当然了,你的根据item的高度自己扫
      

  2.   

    午休时间,回帖比较少你这个问题可能只有自己计算了,用listview的高度除以单个listitem的高度了
      

  3.   

    所有的item通过
    它的listView1.Items[1].Bounds位置信息和
     listView1.TopItem.Bounds 第一个项目的位置信息去比较,判断是不是在可视范围 
      

  4.   

    判断的要素还有listview自己的高和宽
      

  5.   

    下面是一个TreeView的,你看看,改一下就行了。        List<TreeNode> visibleNodes = new List<TreeNode>();//可是的所有的node
            private void button2_Click(object sender, EventArgs e)
            {
                visibleNodes.Clear();
                for (int i = 0; i < this.treeView1.Nodes.Count; i++)
                {
                    if (this.treeView1.Nodes[i].Bounds.Bottom < this.treeView1.Bounds.Bottom && this.treeView1.Nodes[i].Bounds.Bottom > 0)
                    {
                        visibleNodes.Add(this.treeView1.Nodes[i]);
                    }
                    GetVisibleNodes(this.treeView1.Nodes[i]);            }
            }        void GetVisibleNodes(TreeNode node)
            {
                for (int i = 0; i < node.Nodes.Count; i++)
                {
                    if (node.Nodes[i].Bounds.Bottom < treeView1.Bounds.Bottom && node.Nodes[i].Bounds.Bottom > 0 && node.Nodes[i].Bounds.Right < treeView1.Bounds.Right && node.Nodes[i].Bounds.Right > 0)
                    {
                        visibleNodes.Add(node.Nodes[i]);
                    }
                    GetVisibleNodes(node.Nodes[i]);
                }
            }
      

  6.   

    写了一个ListView的,看看吧            List<ListViewItem> items = new List<ListViewItem>();//存放可以显示的items
                for (int i = 0; i < this.listView1.Items.Count; i++)
                {
                    if (this.listView1.Items[i].Bounds.Bottom >= 0 && this.listView1.Items[i].Bounds.Top <= this.listView1.Bounds.Bottom - this.listView1.Bounds.Top
                        && this.listView1.Items[i].Bounds.Right >= this.listView1.Bounds.Left && this.listView1.Items[i].Bounds.Left <= this.listView1.Bounds.Right - this.listView1.Bounds.Left)
                        items.Add(this.listView1.Items[i]);
                }
                MessageBox.Show(items.Count.ToString());
      

  7.   

    在自己回帖的半个小时间,已经写出来了。不用遍历所有的Item
    只需要getItemAt()方法,也不需要扫描很多像素,每次隔每个item高度的一半取一次就够了。谢谢大家。
      

  8.   

    ListView.TopItem 属性:    获取或设置控件中的第一个可见项 
    控件能显示几行,看一下就知道了,
    可视区域内的所有Item 你也就知道了。