1

在下面的代码中,我扩展了 DataGridViewTextBoxCell 类来控制用户将在此字段中输入的值,为此我需要捕获事件 KeyDown。但是只有当我使用键盘在 DGV 中导航时才会调用该事件。当我编辑单元格的值时,事件不会发生。我的代码中缺少什么?

    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            DataGridView dataGridView = new DataGridView();

            MyDataGridViewColumn col = new MyDataGridViewColumn();
            dataGridView.Columns.Add(col);
            dataGridView.Rows.Add(new string[] { "0" });
            dataGridView.Rows.Add(new string[] { "1" });
            dataGridView.Rows.Add(new string[] { "2" });
            dataGridView.Rows.Add(new string[] { "3" });

            this.panel1.Controls.Add(dataGridView);
        }
    }

    public class MyDataGridViewColumn : DataGridViewColumn
    {
        public MyDataGridViewColumn()
        {
            this.CellTemplate = new MyDataGridViewTextBoxCell();
        }
    }

    public class MyDataGridViewTextBoxCell : DataGridViewTextBoxCell
    {
        protected override void OnKeyDown(KeyEventArgs e, int rowIndex)
        {
            base.OnKeyDown(e, rowIndex);

            var key = e.KeyCode;
        }
    }

4

1 回答 1

1

这些击键将由编辑控件处理。如果您想为此目的创建自己的自定义列类型,那么您可以这样做:

  1. 通过从DataGridViewTextBoxEditingControl派生来创建您的编辑控件。然后覆盖OnKeyDown并在那里添加你的逻辑。
  2. 通过从MyDataGridViewTextBoxCell派生来创建您的单元格。然后覆盖EditType并返回您在上一步中创建的编辑控件的类型。
  3. 最后,通过从DataGridViewTextBoxColumn派生并在构造函数中创建列,将您在上一步中创建的单元格的实例设置为其CellTemplate

例子

public class MyDataGridViewTextBoxColumn : DataGridViewTextBoxColumn
{
    public MyDataGridViewTextBoxColumn()
    {
        CellTemplate = new MyDataGridCViewTextBoxCell();
    }
}
public class MyDataGridCViewTextBoxCell : DataGridViewTextBoxCell
{
    public override Type EditType => typeof(MyDataGridViewTextBoxEditingControl);
}
public class MyDataGridViewTextBoxEditingControl : DataGridViewTextBoxEditingControl
{
    protected override void OnKeyDown(KeyEventArgs e)
    {
        base.OnKeyDown(e);
        //Put the logic here
    }
}

注意1:对于不需要创建新列类型的情况,您可以轻松处理的EditingControlShowing事件DataGridView并检查该事件是否属于您想要的列,然后获取编辑控件(并将其转换为正确的类型),然后处理编辑控件的正确事件,例如你可以看一下这个例子中的第一个代码块。

注意 2:如果您有兴趣将自定义属性添加到列/单元格并在编辑控件中使用它们,您可以在这篇文章中找到包含示例代码的分步答案:

于 2021-12-22T23:13:08.370 回答