首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

listview 分组 右键快捷菜单 来着有分!

2012-01-01 
listview 分组 右键快捷菜单 来着有分! 在线等请教各位高手:我现在有个listview,可以进行多选操作,里面进

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设置一致。

C# code
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);            }        }    }}
[解决办法]
探讨
 //初始化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;
}

[解决办法]
设计界面:

运行截图:



[解决办法]
遍历判断当前组是否被选中啊

或做一个标记位

listview选择状态改变时候改变状态值

你根据状态值判断就好了
[解决办法]
我把上面我说的文字方案改成代码方案,实现很简单的,搂主如果没明白上面说的,可以看看下面代码:
private void contextMenuStrip1_Opening(object sender, CancelEventArgs e)


{
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 先!

热点排行