如何在 DataGridView 编辑模式下使工作成为标准热键(Ctrl+C、Ctrl+Z)

本文关键字:标准 Ctrl+C Ctrl+Z DataGridView 编辑 模式 工作 | 更新日期: 2023-09-27 17:56:53

我有一个简单的.net应用程序,每个选项卡上都包含选项卡和数据网格视图。我已将主菜单添加到窗体中,并使用标准属性将热键分配给菜单项:

editMenuItem = new ToolStripMenuItem("Copy", null, new System.EventHandler(onCopyCut_Click));
editMenuItem.ShortcutKeys = Keys.Control | Keys.C;

上面显示的菜单项只是将单元格内容复制到剪贴板。这工作正常,但在 DGV 的编辑模式下 Ctrl+C 和其他标准热键不再工作!

我已将 Form.KeyPreview 属性设置为 true,还尝试关闭我的 Form 对象的 Handle 属性,但没有任何反应:

    void FileOrginizerForm_KeyDown(object sender, KeyEventArgs e)
    {
            ...
        if (gridView.CurrentCell.IsInEditMode)
            e.Handled = false;
    }

我错过了什么?我相信这应该是一件简单的事情。

我在msdn帮助页面的评论中找到了一些信息:

设置这些属性时需要记住的一件事是,如果 窗体中有一个文本框控件,菜单项的快捷键将 拦截该组合键,文本框将永远不会收到它,例如,如果您 有一个粘贴(ctrl + v)快捷键,你的文本框永远不会收到粘贴 命令。根据Microsoft的说法,这是设计使然。他们的解决方法是 暂时清除菜单项的 ShortCutKey 属性以允许粘贴 命令(最有可能在事件期间),然后在事件发生后重置它 完成。

溶液:

我没有打开和关闭菜单快捷方式,而是从主窗体的 KeyDown 事件处理程序调用菜单事件处理程序:

    void FileOrginizerForm_KeyDown(object sender, KeyEventArgs e)
    {
        if (!gridView.CurrentCell.IsInEditMode)
        {
            if (e.KeyData == (Keys.Control | Keys.Z))
            {
                this.editToolStripMenuItem.DropDownItems["Undo"].PerformClick();
            }
            else if (e.KeyData == (Keys.Control | Keys.Y))
            {
                this.editToolStripMenuItem.DropDownItems["Redo"].PerformClick();
            }
            else if (e.KeyData == (Keys.Control | Keys.X))
            {
                    this.editToolStripMenuItem.DropDownItems["Cut"].PerformClick();
            }
            else if (e.KeyData == (Keys.Control | Keys.C))
            {
                    this.editToolStripMenuItem.DropDownItems["Copy"].PerformClick();
            }
            else if (e.KeyData == (Keys.Control | Keys.V))
            {
                    this.editToolStripMenuItem.DropDownItems["Paste"].PerformClick();
            }
            else if (e.KeyData == (Keys.Control | Keys.A))
            {
this.selectToolStripMenuItem.DropDownItems["Select All"].PerformClick();
            }
        }
    }

如何在 DataGridView 编辑模式下使工作成为标准热键(Ctrl+C、Ctrl+Z)

您可以使用下面演示中显示的两个事件暂时删除菜单项中的快捷方式。

using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Windows.Forms;
public class Form1 : Form
{
    [STAThread]
    static void Main()
    {
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);
        Application.Run(new Form1());
    }
    public Form1()
    {
        var dgv = new DataGridView
        {
            Dock = DockStyle.Fill,
            DataSource = new List<DummyObject>
            {
                new DummyObject { Name = "One", Value = 1 },
                new DummyObject { Name = "Two", Value = 2 },
                new DummyObject { Name = "Three", Value = 3 },
            }
        };
        dgv.EditingControlShowing += (s, e) => e.Control.VisibleChanged += DgvEditingControlVisibleChanged;
        Controls.Add(dgv);
    }
    void DgvEditingControlVisibleChanged(object sender, EventArgs e)
    {
        Control control = sender as Control;
        if (control.Visible)
        {
            // The editing control has become visible.
            Trace.WriteLine(String.Format("Editing control showing {0}", control));
        }
        else
        {
            // The editing control has been removed.
            // Remove the event handler because the DGV can use multiple
            //  editing controls if it has different column types. 
            control.VisibleChanged -= DgvEditingControlVisibleChanged;
            Trace.WriteLine(String.Format("Editing control removed {0}", control));
        }
    }
}
public class DummyObject
{
    public string Name { get; set; }
    public int Value { get; set; }
}

如果将SendKeys.Send("^c");添加到菜单项的单击事件中,则无需从菜单项中删除快捷方式

只需从菜单项中删除快捷方式,然后将其文本放在菜单项文本中即可。这适用于使用表单上的快捷方式,但如果单击菜单项本身,您仍然需要编码