在自定义 EditingControl 中使用自定义 DataGridView 列的 属性

Use property of a custom DataGridView Column in a custom EditingControl

我已经创建了我自己的 class MyDataGridViewTextBoxEditingControl 和我的 class MyDataGridViewTextBoxCell。在 MyDataGridViewTextBoxEditingControl 内部,我需要通过属性接收一些信息,但我不知道如何将这些值从 MyDataGridViewTextBoxCell 发送到 MyDataGridViewTextBoxEditingControl,然后将 return 值从 MyDataGridViewTextBoxEditingControl 发送到 MyDataGridViewTextBoxCell。我不知道如何通过属性在这两个 class 之间交换信息。任何帮助将不胜感激。

    public class MyDataGridViewTextBoxCell : DataGridViewTextBoxCell
    {
        public double ExactValue { get; set; }
        public int DecimalPlaces { get; set; }
        public Color ErrorForeColor { get; set; }

        public override Type EditType => typeof(MyDataGridViewTextBoxEditingControl);
    }

    public class MyDataGridViewTextBoxEditingControl : DataGridViewTextBoxEditingControl
    {
        double exactValue = 0;
        int decimalPlaces = 3;
        Color errorForeColor = Color.Black;

        public double ExactValue { get => exactValue; }
        public int DecimalPlaces { get => decimalPlaces; set => decimalPlaces = value; }
        public Color ErrorForeColor { get => errorForeColor; set => errorForeColor = value; }

        protected override void OnKeyDown(KeyEventArgs e)
        {
            base.OnKeyDown(e);

            //My logic goes here
        }
    }

我知道上面的例子可以用其他更简单的方法来实现,但这只是我需要的一个简单例子。

您可以使用以下步骤将新的 属性 添加到您的新列类型:

  1. 为您的自定义单元格类型定义 属性。
  2. 为您的自定义编辑控件定义 属性。
  3. 定义自定义列类型的 属性 和 get/set 列 CellTemplate 的 属性 的值。
  4. 覆盖单元格的 Clone 方法并包括为克隆设置新的 属性 值。
  5. 重写单元格的 InitializeEditingControl 方法并为编辑控件设置 属性。

示例 - 自定义 DataGridView 列的新 属性 并在编辑控件中使用它

在下面的示例中,我为我的自定义列创建了一个 MyProperty 并在编辑控件中使用了它:

using System;
using System.Windows.Forms;
public class MyDataGridViewTextBoxColumn : DataGridViewTextBoxColumn
{
    public MyDataGridViewTextBoxColumn()
    {
        CellTemplate = new MyDataGridCViewTextBoxCell();
    }
    public string MyProperty
    {
        get => ((MyDataGridCViewTextBoxCell)CellTemplate).MyProperty;
        set => ((MyDataGridCViewTextBoxCell)CellTemplate).MyProperty = value;
    }
}
public class MyDataGridCViewTextBoxCell : DataGridViewTextBoxCell
{
    public override Type EditType => typeof(MyDataGridViewTextBoxEditingControl);
    public override void InitializeEditingControl(int rowIndex,
        object initialFormattedValue, DataGridViewCellStyle dataGridViewCellStyle)
    {
        base.InitializeEditingControl(rowIndex, initialFormattedValue, 
            dataGridViewCellStyle);
        var editingControl = this.DataGridView.EditingControl as 
            MyDataGridViewTextBoxEditingControl;
        if (editingControl != null)
        {
            editingControl.MyProperty = MyProperty;
        }
    }
    public string MyProperty { get; set; }
    public override object Clone()
    {
        var clone = (MyDataGridCViewTextBoxCell)base.Clone();
        clone.MyProperty = this.MyProperty;
        return clone;
    }
}
public class MyDataGridViewTextBoxEditingControl : DataGridViewTextBoxEditingControl
{
    public string MyProperty { get; set; }
    protected override void OnKeyDown(KeyEventArgs e)
    {
        base.OnKeyDown(e);
        //Put the logic here, for example:
        MessageBox.Show(this.MyProperty);
    }
}

注意:正如我在回答您之前的问题时提到的,对于不需要创建新列类型的情况,您可以轻松处理EditingControlShowing event of the DataGridView and check if the event belongs to your desired column, then get the editing control (and cast it to the right type), and then handle the proper event of the editing control, for example you can take a look at first code block in .