この MSDN サンプルDataGridViewCalendarCell
に基づいて を作成しています。に 2 つのプロパティを追加したため、基本クラスの Clone をオーバーライドしたいと考えています。問題は、これについてどうすればよいかわからないことです。DataGridViewTextBoxCell
DataGridViewCalendarCell
Clone をオーバーライドする必要があると思う理由:
にDateTimePicker
は 2 つのプロパティがあります。CustomFormat
とを初期化するときに設定できるクラスFormat
のプロパティを介して公開します。これらのプロパティは、列がテンプレートとして使用するプロパティを次のように設定します。CalendarColumn
CalendarColumn
DataGridViewCalendarCell
public string CustomFormat {
get {
return ((DataGridViewCalendarCell)base.CellTemplate).CustomFormat;
}
set {
((DataGridViewCalendarCell)base.CellTemplate).CustomFormat = value;
}
}
public DateTimePickerFormat Format {
get {
return ((DataGridViewCalendarCell)base.CellTemplate).Format;
}
set {
((DataGridViewCalendarCell)base.CellTemplate).Format = value;
}
}
関数では、セル値の編集に使用されるDataGridViewCalendarCell.InitializeEditingControl
にプロパティが再び渡されます。DateTimePicker
私が抱えている問題は、 whenDataGridViewCalendarCell.InitializeEditingControl
が呼び出され、もう設定されていないことですFormat
。CustomFormat
これは、実際DataGridViewCalendarCell
の s がテンプレートのクローンであるためだと推測しています。Clone
のメソッドをオーバーライドしなかったためDateGridViewTextBoxCell
、余分なプロパティも複製されません。
また、MSDN の記事に素晴らしいメモがあります。
DataGridViewCell または DataGridViewColumn から派生させ、新しいプロパティを派生クラスに追加する場合は、複製操作中に Clone メソッドをオーバーライドして新しいプロパティをコピーしてください。基本クラスのプロパティが新しいセルまたは列にコピーされるように、基本クラスの Clone メソッドも呼び出す必要があります。
Clone をオーバーライドする方法がわからない理由:
これは、WinForms コントロールに対してこれを行う標準的な方法があるように感じさせますが、それについては何も見つかりません。
DataGridViewTextBoxCell
から返されたクローンを渡すことができるコピー コンストラクターはありませんbase.Clone()
。どのプロパティをコピーする必要があり、どのプロパティをコピーしてはならないかを判断する方法がわからないため、Reflection を使用しないことを好みます。連載でなんとかならないかなと思っていますが、今は見切れない副作用が怖いです。
カスタム コントロールで Clone をオーバーライドする標準的な方法はありますか?
編集: クローンはすべてのカスタム コントロールに関連するわけではなく、DataGridViewCell
sのみに関連するため、質問のタイトルを編集しました