listview 分组 右键快捷菜单 来着有分! 在线等
请教各位高手:
我现在有个listview,可以进行多选操作,里面进行了分组,有2组的数据, 各组有多条数据,我现在有个快捷菜单,我希望这个菜单在只选中第一组数据时弹出其中某几个菜单项,只选中第二组数据时弹出另外几个菜单项。在第一组和第二组都有数据被选中时,弹出他们公用的菜单项。
请教高手这种情况应该怎么做。。 我怎么知道他选中的是哪组数据。
[解决办法]
每一组都有一个Group,搂主可以用的
你添加项的时候也要用到的
[解决办法]
噢,那搂主可以使用ListViewItem.Group 来判断当前选中项所属的分组
注意:要循环判断的
[解决办法]
如果选中项的Group属性都是一样的,并且是第一组,那么弹出第一个菜单
如果是都是第二组,那么弹出第二个菜单
否则,弹出第三个菜单
不过,建议搂主把所有菜单项都放在一个菜单里面,然后在菜单条控件的Opening事件里面
作如上判断,然后通过显示和隐藏相应的菜单项,达到你的效果
[解决办法]
ListViewHitTestInfo获取鼠标点击的数据~
[解决办法]
这个一般不影响效率的,因为是很快的,并且仅仅是弹出菜单的时候作判断
搂主也可以缓存一下判断结果,然后如果选中项改变了,重值这个变量
对于搂主的需求,应该没有其他实现方案
6楼说的是如何获取鼠标点击项的
[解决办法]
帮顶
[解决办法]
我定义了一个ListView,两个分组。
Group1下面有item1,item2。Gourp2下面有item3,item4.
一个菜单,有4个菜单项:menu1,menu2,menu3,menu4.
可以利用tag属性,给group设置tag为0,1,……。
对应的menuItem的tag参照group设置一致。
using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Text;using System.Windows.Forms;namespace WindowsApplication1{ public partial class FormListView : Form { public FormListView() { InitializeComponent(); } private void contextMenuStrip1_Opening(object sender, CancelEventArgs e) { ContextMenuStrip menu = sender as ContextMenuStrip; //初始化tag属性,因ListView只有两个分组,menu.tag对应为0,1 for (int i = 0; i < menu.Items.Count; i++) { menu.Items[i].Tag = i % 2; } //设置ListViewGroup的tag为0,1,…… for (int i = 0; i < listView1.Groups.Count; i++) { listView1.Groups[i].Tag = i; } Dictionary<object, bool> dict = new Dictionary<object, bool>(); foreach (ListViewItem lvi in listView1.SelectedItems) { dict[lvi.Group.Tag] = true; } //ContextMenuStrip menu = sender as ContextMenuStrip; foreach (ToolStripMenuItem mi in menu.Items) { mi.Visible = dict.ContainsKey(mi.Tag); } } }}
[解决办法]
{
if (this.listView1.SelectedItems.Count <= 0)
{
e.Cancel = true;//没有选择项,不弹出菜单
return;
}
ListViewGroup group = null;
foreach (ListViewItem selectedItem in this.listView1.SelectedItems)
{
if (group == null)
{
group = selectedItem.Group;
continue;
}
//有选中项不同一个组
if (selectedItem.Group != group)
{
//在这里,使一些菜单项不可用或者隐藏,仅仅使共有的菜单项可用
return; //这里就return了,所以一般不会循环所有被选中项
}
}
if (group == null)
{
e.Cancel = true;//没有选择项,不弹出菜单
return;
}
//如果执行到了这一步,那么说明选中项都在同一个组,然后在这里设置使一些菜单项不可用或者隐藏
//1、如果是第一组
if (this.listView1.Groups[0] == group)
{
//在这里,设置使一些菜单项不可用或者隐藏
return;
}
//2、如果是第二组
if (this.listView1.Groups.Count > 1 && this.listView1.Groups[1] == group)
{
//在这里,设置使一些菜单项不可用或者隐藏
return;
}
}
[解决办法]
快下班了,头有点晕, mark 先!