2023/05/02(Tue) 19:36:34 編集(投稿者)
■No101855 (brid さん) に返信
DataGridView で DateTimePicker を使うには最低3つのクラスを作成してください。
(1) DataGridViewDateTimePickerColumn クラス
DataGridViewColumn を継承して作成します。
(2) DataGridViewDateTimePickerCell クラス
DataGridViewCell クラスを継承して、拡張機能を提供するクラス
DataGridViewTextBoxCell を継承すると楽かと思います。
(3) DataGridViewDateTimeEditingControl クラス
DateTimePicker を継承し IDataGridViewEditingControl インターフェイスを実装します。
最低限のコードを書いておきますが、詳しくは
https://learn.microsoft.com/ja-jp/dotnet/desktop/winforms/controls/customize-cells-and-columns-in-the-datagrid-by-extending-behavior?view=netframeworkdesktop-4.8
を参照してください。
using System;
using System.Windows.Forms;
using System.Globalization;
public class DataGridViewDateTimePickerColumn : DataGridViewColumn
{
public DataGridViewDateTimePickerColumn()
: base(new DataGridViewDateTimePickerCell()) { }
}
public class DataGridViewDateTimePickerCell : DataGridViewTextBoxCell
{
public override void InitializeEditingControl(int rowIndex, object initialFormattedValue, DataGridViewCellStyle dataGridViewCellStyle) {
base.InitializeEditingControl(rowIndex, initialFormattedValue, dataGridViewCellStyle);
if (DataGridView.EditingControl is DataGridViewDateTimeEditingControl dateTimePicker) {
dateTimePicker.EditingControlFormattedValue = Value;
}
}
public override Type EditType => typeof(DataGridViewDateTimeEditingControl);
}
public class DataGridViewDateTimeEditingControl : DateTimePicker, IDataGridViewEditingControl
{
private readonly DateTime defaultValue = DateTime.Today;
private const string customFormat = "HH:mm";
public DataGridViewDateTimeEditingControl() {
Format = DateTimePickerFormat.Custom;
CustomFormat = customFormat;
ShowUpDown = true;
TabStop = false;
}
public void ApplyCellStyleToEditingControl(DataGridViewCellStyle dataGridViewCellStyle) {
Font = dataGridViewCellStyle.Font;
}
public bool EditingControlWantsInputKey(Keys keyData, bool dataGridViewWantsInputKey) {
return base.IsInputKey(keyData);
}
public object GetEditingControlFormattedValue(DataGridViewDataErrorContexts context) {
return Value.ToString(customFormat);
}
public void PrepareEditingControlForEdit(bool selectAll) {
if (selectAll) Select();
}
public DataGridView EditingControlDataGridView { get; set; }
public object EditingControlFormattedValue {
get => Value.ToString(customFormat);
set {
if (value == null) {
Value = defaultValue;
} else {
string stringValue = value?.ToString();
if (!DateTime.TryParseExact(stringValue, customFormat,
null, DateTimeStyles.None, out DateTime dateTimeValue)) {
throw new ArgumentException();
}
Value = dateTimeValue;
}
}
}
public int EditingControlRowIndex { get; set; }
public bool EditingControlValueChanged { get; set; } = false;
public Cursor EditingPanelCursor => base.Cursor;
public bool RepositionEditingControlOnValueChange => true;
protected override void OnValueChanged(EventArgs eventargs) {
base.OnValueChanged(eventargs);
if (EditingControlDataGridView != null) {
EditingControlValueChanged = true;
EditingControlDataGridView.NotifyCurrentCellDirty(true);
}
}
}