DataGridViewコントロール−継承して拡張する
DataGridViewColumn や DataGridViewCell を継承してプロパティや動作を拡張するサンプルです。
IDataGridViewEditingControl から派生し、Control を実装するクラスも継承して拡張します。
DataGridViewColumn は、CellTemplate プロパティで、DataGridViewCell にアクセスします。
プロパティは DataGridViewCell に持ち、DataGridViewColumn からアクセスできるプロパティを持ちます。
DataGridViewCell は、拡張したプロパティを保持します。
拡張したプロパティは、コンストラクタで初期化し、Clone メソッドや InitializeEditingControl メソッドで
メンテナンスする必要があります。
DataGridViewCell は、DataGridView.Columns[ColumnIndex] で、DataGridViewColumn にアクセスします。
IDataGridViewEditingControl から派生し、Control を実装するクラスは、DataGridViewTextBoxEditingControl 等の
既に実装してあるクラスから継承できれば簡単です。
EditingControlDataGridView.CurrentCell で DataGridViewCell にアクセスします。
今回は、Windows Forms のための検証コントロール で作成した検証プロパティを実装しています。
public class ValidationTextBoxColumn : DataGridViewColumn
{
public ValidationTextBoxColumn() : base(new ValidationTextBoxCell())
{
}
public override DataGridViewCell CellTemplate
{
get
{
return base.CellTemplate;
}
set
{
if (value != null && !value.GetType().IsAssignableFrom(typeof(ValidationTextBoxCell)))
{
throw new InvalidCastException("CellTemplateはValidationTextBoxCellでなくてはなりません。");
}
base.CellTemplate = value;
}
}
private ValidationTextBoxCell ValidationTextBoxCellTemplate
{
get
{
return (ValidationTextBoxCell)this.CellTemplate;
}
}
[Category("Validation"), Description("検証プロパティを取得または設定します。")]
[DesignerSerializationVisibility(DesignerSerializationVisibility.Visible)]
public ValidationProperty Validation
{
get
{
if (ValidationTextBoxCellTemplate == null)
{
throw new InvalidOperationException("ValidationTextBoxColumnはCellTemplateがなくてはなりません。");
}
return ValidationTextBoxCellTemplate.Validation;
}
set
{
if (ValidationTextBoxCellTemplate == null)
{
throw new InvalidOperationException("ValidationTextBoxColumnはCellTemplateがなくてはなりません。");
}
ValidationTextBoxCellTemplate.Validation = value;
}
}
}
public class ValidationTextBoxCell : DataGridViewTextBoxCell
{
public ValidationTextBoxCell() : base()
{
_validation = new ValidationProperty();
}
public override void InitializeEditingControl(int rowIndex, object
initialFormattedValue, DataGridViewCellStyle dataGridViewCellStyle)
{
base.InitializeEditingControl(rowIndex, initialFormattedValue, dataGridViewCellStyle);
ValidationTextBoxColumn column = DataGridView.Columns[ColumnIndex] as ValidationTextBoxColumn;
if (column != null) Validation = CloneValidationProperty(column.Validation);
}
public override Type EditType
{
get
{
return typeof(ValidationTextBoxEditingControl);
}
}
private ValidationProperty _validation;
public ValidationProperty Validation
{
get { return _validation; }
set { _validation = value; }
}
private ValidationProperty CloneValidationProperty(ValidationProperty prop)
{
return new ValidationProperty(
prop.ValidationType,
prop.EnableRequiredFieldValidator, prop.EnableCompareValidator,
prop.EnableRangeValidator, prop.EnableRegularExpressionValidator,
prop.ItemName, prop.CompareControlItemName,
prop.MinimumControlItemName, prop.MaximumControlItemName,
prop.ValueToCompare, prop.MinimumValue,
prop.MaximumValue, prop.ValidationExpression,
prop.RequiredFieldErrorMessage, prop.TypeMissmatchErrorMessage,
prop.CompareErrorMessage, prop.RangeErrorMessage,
prop.RegularExpressionErrorMessage,
prop.ControlToCompare, prop.ControlToMinimum, prop.ControlToMaximum,
prop.ErrorProvider);
}
public override object Clone()
{
ValidationTextBoxCell cell = base.Clone() as ValidationTextBoxCell;
if (cell != null) cell.Validation = CloneValidationProperty(_validation);
return cell;
}
}
class ValidationTextBoxEditingControl : DataGridViewTextBoxEditingControl
{
public ValidationTextBoxEditingControl()
{
}
protected override void OnValidating(CancelEventArgs e)
{
ValidationTextBoxCell cell = EditingControlDataGridView.CurrentCell as ValidationTextBoxCell;
if (cell != null && cell.Validation.DoValidating(this, this.Text))
{
cell.ErrorText = cell.Validation.ErrorMessage;
e.Cancel = true;
return;
}
e.Cancel = false;
base.OnValidating(e);
}
}



