datagridview c# 键盘上的多项选择

multiple selection on keyboard for datagridview c#

我需要为 datagridview 创建一些键盘快捷键。 我需要允许用户在不使用鼠标的情况下 select 多个 行。 例如 在 windows 资源管理器中,您可以: 先按住Ctrl(select) Up/down (移至下一个 selection) Space (select 其他)。 这可以在 C# 中完成吗?

是的,这是可能的。因为Ctrl+ 已有默认行为(例如分别导航到最左侧、最右侧、最顶部和最底部的单元格),您必须继承 DataGridView class 并覆盖 ProcessDataGridViewKey 方法来处理这些用户操作以及 Ctrl+Space选择一行。

public class MultSelectKeyDGV : DataGridView
{
    protected override bool ProcessDataGridViewKey(KeyEventArgs e)
    {
        KeyEventArgs keyEventArgs = null;
        DataGridViewSelectedCellCollection selectedCells = null;
        bool selectRow = false;

        if (e.Control)
        {
            switch (e.KeyCode)
            {
                case Keys.Down:
                    keyEventArgs = new KeyEventArgs(Keys.Down);
                    selectedCells = this.SelectedCells;
                    break;
                case Keys.Up:
                    keyEventArgs = new KeyEventArgs(Keys.Up);
                    selectedCells = this.SelectedCells;
                    break;
                case Keys.Right:
                    keyEventArgs = new KeyEventArgs(Keys.Right);
                    selectedCells = this.SelectedCells;
                    break;
                case Keys.Left:
                    keyEventArgs = new KeyEventArgs(Keys.Left);
                    selectedCells = this.SelectedCells;
                    break;
                case Keys.Space:
                    keyEventArgs = new KeyEventArgs(Keys.None);
                    selectRow = true;
                    break;
                default:
                    keyEventArgs = e;
                    break;
            }
        }
        else
        {
            keyEventArgs = e;
        }

        bool result = base.ProcessDataGridViewKey(keyEventArgs);

        if (e.Control)
        {
            this.CurrentRow.Selected = selectRow;
            this.KeepSelected(selectedCells); 
        }

        return result;
    }

    private void KeepSelected(DataGridViewSelectedCellCollection selected)
    {
        if (selected != null && this.MultiSelect)
        {
            foreach (DataGridViewCell cell in selected)
            {
                cell.Selected = true;
            }
        }
    }
}

现在只需将 FormDataGridView 对象的实例替换为此 class 的实例即可。