我创建了自己的类MyDataGridViewTextBoxEditingControl和类MyDataGrid ViewTextBoxCell。在MyDataGridViewTextBoxEditingControl中,我需要通过属性接收一些信息,但我不知道如何将这些值从MyDataGridViewTextBoxCell发送到MyDataGridView TextBoxEdittingControl,然后将值从MyDataGridViewTextBoxEditingControl返回到MyDataGrid ViewTextBoxCell。我不知道如何通过属性在这两个类之间交换信息。任何帮助都将不胜感激。
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
}
}
我知道上面的例子可以通过其他更简单的方式实现,但这只是我需要的一个简单的例子。
您可以使用以下步骤向新列类型添加新属性:
- 定义自定义单元格类型的属性
- 定义自定义编辑控件的属性
- 定义自定义列类型的属性,并获取/设置列的CellTemplate属性的值
- 覆盖单元的"克隆"方法并包含为克隆设置新的属性值
- 重写单元格的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);
}
}
注意:正如我在回答您之前的问题时提到的,对于不需要创建新列类型的情况,您可以轻松处理DataGridView
的EditingControlShowing事件,并检查该事件是否属于您想要的列,然后获得编辑控件(并将其转换为正确的类型(,然后处理编辑控件的正确事件,例如,您可以查看本例中的第一个代码块。