菜单项事件处理程序

时间:2017-06-02 14:16:52

标签: c# datagridview menu-items

我正在尝试通过使用右键单击菜单修改DataGridView对象。

目前我可以成功创建右键单击菜单并确定选择菜单项后将调用的方法,但目标方法无法访问有关菜单项时选择DataGridView中哪条记录的信息被选中 - 或任何其他信息(除非它是一个类级变量)。

我的目标是找到一种方法将信息发送到目标方法,或者找到一种方法来修改DataGridView对象,方法与创建右键单击菜单的方法相同。

https://msdn.microsoft.com/en-us/library/system.windows.forms.menuitem(v=vs.110).aspx

        private void InspectionDataGridViewCellMouseClick(object sender, DataGridViewCellMouseEventArgs e)
    {
        if (e.Button == MouseButtons.Right)
        {
            ContextMenu m = new ContextMenu();

                if (this.currentInspection != null) // the row that is being right-clicked might not be the row that is selected.
                {
                    m.MenuItems.Add(new MenuItem(string.Format("Mark inspection point {0} as complete.", this.currentInspection.InspectionNumber), this.markInspectionPointComplete));
                }
            m.Show(this.InspectionDataGridView, new Point(e.X,e.Y));
        }
    }

    private void markInspectionPointComplete(object sender, EventArgs e)
    {
        MessageBox.Show("the right-click menu works.");
    }

我尝试使用 DataGridViewCellMouseEventArgs 对象调用目标方法,但这会在 m.MenuItems.Add()行中产生错误,因为它只需要 EventArgs 对象。

因此,我需要修改发送的EventArgs对象,找到另一个用于此目的的方法签名,或者找到一种在创建右键单击菜单的同一方法中对DataGridView执行操作的方法。 / p>

提前致谢!

1 个答案:

答案 0 :(得分:0)

最简单的解决方案是使用'标记' “菜单”的属性'对象

private void InspectionDataGridViewCellMouseClick(object sender, DataGridViewCellMouseEventArgs e)
{
    if (e.Button == MouseButtons.Right)
    {
        ContextMenu m = new ContextMenu();

        int currentRow = e.RowIndex;
            if (this.currentInspection != null) // the row that is being right-clicked might not be the row that is selected.
            {
                var MI = new MenuItem(string.Format("Mark inspection point {0} as complete.", this.currentInspection.InspectionNumber));
                MI.Click += (s, x) =>
                {
                    // Use 'e' or 'sender' here
                }
                m.MenuItems.Add(MI);
            }
        m.Show(this.InspectionDataGridView, new Point(e.X,e.Y));
    }
}

使用这样的lambda表达式:

unmatched.getData()