1

この MSDN サンプルDataGridViewCalendarCellに基づいて を作成しています。に 2 つのプロパティを追加したため、基本クラスの Clone をオーバーライドしたいと考えています。問題は、これについてどうすればよいかわからないことです。DataGridViewTextBoxCellDataGridViewCalendarCell

Clone をオーバーライドする必要があると思う理由:

DateTimePickerは 2 つのプロパティがあります。CustomFormatとを初期化するときに設定できるクラスFormatのプロパティを介して公開します。これらのプロパティは、列がテンプレートとして使用するプロパティを次のように設定します。CalendarColumnCalendarColumnDataGridViewCalendarCell

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が呼び出され、もう設定されていないことですFormatCustomFormat

これは、実際DataGridViewCalendarCellの s がテンプレートのクローンであるためだと推測しています。CloneのメソッドをオーバーライドしなかったためDateGridViewTextBoxCell、余分なプロパティも複製されません。

また、MSDN の記事に素晴らしいメモがあります。

DataGridViewCell または DataGridViewColumn から派生させ、新しいプロパティを派生クラスに追加する場合は、複製操作中に Clone メソッドをオーバーライドして新しいプロパティをコピーしてください。基本クラスのプロパティが新しいセルまたは列にコピーされるように、基本クラスの Clone メソッドも呼び出す必要があります。

Clone をオーバーライドする方法がわからない理由:

これは、WinForms コントロールに対してこれを行う標準的な方法があるように感じさせますが、それについては何も見つかりません。

DataGridViewTextBoxCellから返されたクローンを渡すことができるコピー コンストラクターはありませんbase.Clone()。どのプロパティをコピーする必要があり、どのプロパティをコピーしてはならないかを判断する方法がわからないため、Reflection を使用しないことを好みます。連載でなんとかならないかなと思っていますが、今は見切れない副作用が怖いです。

カスタム コントロールで Clone をオーバーライドする標準的な方法はありますか?

編集: クローンはすべてのカスタム コントロールに関連するわけではなく、DataGridViewCellsのみに関連するため、質問のタイトルを編集しました

4

1 に答える 1