えムナウのプログラミングのページ

えムナウ の とどけもの

 Logo えムナウBlog@AILight
えムナウBlog@Wankuma

目次

利用状況

イメージ ギャラリー

カテゴリ

Links
 

inetaj

MSMVPロゴ
MSMVP Visual C# 2005/01-2007/12

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