获取 ListView 可视区域内的Item Winform中如何获取ListView可视区域内的所有Item? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 你可以根据你的listview所在的坐标计算出item存在的范围,然后用getItemAt(x, y);就可以知道鼠标可以扫过的item了,当然了,你的根据item的高度自己扫 午休时间,回帖比较少你这个问题可能只有自己计算了,用listview的高度除以单个listitem的高度了 所有的item通过它的listView1.Items[1].Bounds位置信息和 listView1.TopItem.Bounds 第一个项目的位置信息去比较,判断是不是在可视范围 判断的要素还有listview自己的高和宽 下面是一个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]); } } 写了一个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()); 在自己回帖的半个小时间,已经写出来了。不用遍历所有的Item只需要getItemAt()方法,也不需要扫描很多像素,每次隔每个item高度的一半取一次就够了。谢谢大家。 ListView.TopItem 属性: 获取或设置控件中的第一个可见项 控件能显示几行,看一下就知道了,可视区域内的所有Item 你也就知道了。 关于伪静态问题 这一行代码什么意思呀? 图像的几何变换 来高手 C#的Spread中金额数据的显示 GridView中OnRowEditing的处理 98系统装不了.net环境 高手们请问一下是不是用sn.exe强名称必须安装.net啊,光框架是不能用啊 再次提问,难道没有人知道C# Winform里面的Column的汉字是怎么弄上去的吗? 网络问题 来了! c#中的button没有ownerdraw属性,怎样实现自画控件 结构体传递的问题 两种方法遍历哈溪表时都会导致 集合已修改;可能无法执行枚举操作
它的listView1.Items[1].Bounds位置信息和
listView1.TopItem.Bounds 第一个项目的位置信息去比较,判断是不是在可视范围
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]);
}
}
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());
只需要getItemAt()方法,也不需要扫描很多像素,每次隔每个item高度的一半取一次就够了。谢谢大家。
控件能显示几行,看一下就知道了,
可视区域内的所有Item 你也就知道了。