日期:2014-05-18  浏览次数:20886 次

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)