【问题标题】:Use property of a custom DataGridView Column in a custom EditingControl在自定义 EditingControl 中使用自定义 DataGridView 列的属性
【发布时间】:2021-12-29 16:06:12
【问题描述】:

我创建了自己的 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
        }
    }

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

【问题讨论】:

  • 通常,在 EditControlShowing 事件中,您可以设置自己的对象并让它发挥作用。如果您保留对它的引用,您可以稍后访问它的状态..

标签: c# winforms datagridview user-controls datagridviewtextboxcell


【解决方案1】:

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

  1. 为您的自定义单元格类型定义属性。
  2. 为您的自定义编辑控件定义属性。
  3. 为您的自定义列类型定义属性并获取/设置该列的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 事件@987654331 @ 并检查事件是否属于您想要的列,然后获取编辑控件(并将其转换为正确的类型),然后处理编辑控件的正确事件,例如您可以查看第一个代码块this example.

【讨论】:

  • 非常感谢!
猜你喜欢
  • 2017-06-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-28
  • 1970-01-01
  • 1970-01-01
  • 2011-03-27
相关资源
最近更新 更多