Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/256.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 我是否可以检测用户是否右键单击Winforms中的ListView列标题?_C#_.net_Winforms_Mouseevent - Fatal编程技术网

C# 我是否可以检测用户是否右键单击Winforms中的ListView列标题?

C# 我是否可以检测用户是否右键单击Winforms中的ListView列标题?,c#,.net,winforms,mouseevent,C#,.net,Winforms,Mouseevent,我指的不是listview项目的内部,而是允许您调整列大小的列标题。一个简单的用户控件覆盖了listview的onMouseCenterOnMouseLeave和WndProc public partial class MyListView : ListView { public MyListView() { } public delegate void ColumnContextMenuHandler(object sender, ColumnHeader c

我指的不是listview项目的内部,而是允许您调整列大小的列标题。

一个简单的用户控件覆盖了
listview
onMouseCenter
OnMouseLeave
WndProc

public partial class MyListView : ListView
{
    public MyListView()
    {
    }

    public delegate void ColumnContextMenuHandler(object sender, ColumnHeader columnHeader);
    public event ColumnContextMenuHandler ColumnContextMenuClicked = null;

    bool _OnItemsArea = false;
    protected override void OnMouseEnter(EventArgs e)
    {
        base.OnMouseEnter(e);
        _OnItemsArea = true;
    }

    protected override void OnMouseLeave(EventArgs e)
    {
        base.OnMouseLeave(e);
        _OnItemsArea = false;
    }

    const int WM_CONTEXTMENU = 0x007B;

    protected override void WndProc(ref Message m)
    {
        if (m.Msg == WM_CONTEXTMENU)
        {
            if (!_OnItemsArea)
            {
                Point p = base.PointToClient(MousePosition);
                int totalWidth = 0;
                foreach (ColumnHeader column in base.Columns)
                {
                    totalWidth += column.Width;
                    if (p.X < totalWidth)
                    {
                        if (ColumnContextMenuClicked != null) ColumnContextMenuClicked(this, column);
                        break;
                    }
                }
            }
        }
        base.WndProc(ref m);
    }
}

OnMouseEnter/Leave解决方案有时甚至不在标题上显示上下文菜单。这里有更好的解决方案

谢谢,它很有效。它告诉我,我只能在20小时内获得积分。“那么我就这样做了。”埃德:你这是什么意思?我以为它是从ListView继承的自定义控件,不是吗?实际上是一个.NET类,用于容纳多个控件,即复合控件。在本例中,您有一个从
ListView
继承的用户定义类型。我有点迂腐,但我认为值得一提,因为术语
UserControl
实际上有不同的含义。@EdS:谢谢Ed,我现在明白你的意思了。再重复一点。在此之前,将链接作为答案发布并不理想,它们通常会被删除。或者,如果问题不是重复的,则根据具体问题定制答案。
 myListView1.ColumnContextMenuClicked += (sndr, col) =>
 {
    this.Text = col.Text;
 };