1

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

    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
        }
    }

我知道上面的示例可以通过其他更简单的方式实现,但这只是我需要的一个简单示例。

4

1 回答 1

1

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

  1. 为您的自定义单元格类型定义属性。
  2. 为您的自定义编辑控件定义属性。
  3. 为您的自定义列类型定义属性并获取/设置列的CellTemplate的属性值。
  4. 覆盖单元格的克隆方法并包括为克隆设置新的属性值。
  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事件DataGridView并检查该事件是否属于您想要的列,然后获取编辑控件(并将其转换为正确的类型),然后处理编辑控件的正确事件,例如您可以查看此示例中的第一个代码块。

于 2021-12-29T16:42:21.920 回答