C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[4]: C# datagridview指定の列を時間で表示入力したい


(過去ログ 177 を表示中)

[トピック内 5 記事 (1 - 5 表示)]  << 0 >>

■101855 / inTopicNo.1)  C# datagridview指定の列を時間で表示入力したい
  
□投稿者/ brid (1回)-(2023/04/29(Sat) 19:28:47)

分類:[C#] 

2023/05/01(Mon) 17:41:40 編集(投稿者)
2023/05/01(Mon) 17:40:15 編集(投稿者)

Grid1 = new DataGridView();
Grid1.SetBounds(10, 70, 830, 200); //位置を(左右, 上下)、大きさを 幅x高さ
Grid1.ReadOnly = false;
Grid1.RowTemplate.Height = 30; //行の高さ
Grid1.ColumnCount = 12;
Grid1.RowCount = 5;
としてDataGridViewがあります。
そのDataGridViewに時間表示されるように

Griddate = new DateTimePicker();
Griddate.Format = DateTimePickerFormat.Custom;
Griddate.CustomFormat = "HH:mm"; //時間
Grid1.Controls.Add(Griddate);

として挿入することはできたのですが、DataGridViewの0列目のヘッダーに挿入されてしまいました。

これを1列目と2列目にDateTimePickerを挿入したいです。ただ、時間は今の時間ではなく任意の時間を12:35などと表記させたいです。

どのように変更するればいいのでしょうか?
よろしくお願いいたします。

引用返信 編集キー/
■101871 / inTopicNo.2)  Re[1]: C# datagridview指定の列を時間で表示入力したい
□投稿者/ KOZ (402回)-(2023/05/02(Tue) 19:35:49)
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);
        }
    }
}

引用返信 編集キー/
■101876 / inTopicNo.3)  Re[2]: C# datagridview指定の列を時間で表示入力したい
□投稿者/ brid (3回)-(2023/05/03(Wed) 14:58:57)
ありがとうございます。
まだ試してないのですが、始めたばかりなので、優れたコードは理解できていません。
どのように追記していいのかもわかりません。

初心者で理解できていないのですが、1列目と2列目にDateTimePickerを挿入はどのコードになりますか?
質問ばかりですみません。
引用返信 編集キー/
■101877 / inTopicNo.4)  Re[3]: C# datagridview指定の列を時間で表示入力したい
□投稿者/ KOZ (403回)-(2023/05/03(Wed) 15:10:24)
2023/05/03(Wed) 15:17:28 編集(投稿者)

No101876 (brid さん) に返信
> 初心者で理解できていないのですが、1列目と2列目にDateTimePickerを挿入はどのコードになりますか?

提示したコードを適当なクラスファイルにいれてビルドしてください。
デザイナでフォームに DataGridView を配置すれば、DataGridViewDateTimePickerColumn を追加することができます。
あとは、ここを見れば使い方がわかるでしょう。

「DataGridViewの使い方をマスターしよう!基本的な操作まとめ」
https://marunaka-blog.com/csharp-datagridview-use/3088/

引用返信 編集キー/
■101879 / inTopicNo.5)  Re[4]: C# datagridview指定の列を時間で表示入力したい
□投稿者/ brid (4回)-(2023/05/04(Thu) 16:19:53)
ありがとうございます。
まだ理解できていなく実装できていないのですが、勉強したいと思います。

解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -