🙄

【FpSpread】時刻入力セルを自作した

2024/03/20に公開

はじめに

ナレッジベースに「日付型セルに時刻入力で24時以降を入力する事は可能ですか?」の回答でGcTimeSpan型セルを使うとできると書いてあるのですが、私の環境ではGcTimeSpan型がなかったので、自作してみました。

検証環境

c# 12.0
SPREAD for Windows Forms 10.0 

実装例

public class TimeOriginalCellType : MaskCellType
{
     public TimeOriginalCellType()
     {
         this.Mask = "##:##";
     }

     public override string Format(object obj)
     {
         if (obj == null)
         {
             return string.Empty;
         }
         var value = obj.ToString();
         TimeSpan time;
         if (TimeSpan.TryParse(value, out time))
         {
             int hours = time.Days * 24 + time.Hours;
             return $"{hours}:{time.Minutes}";
         }
         return string.Empty;
     }

     public override object GetEditorValue()
     {
         if (base.GetEditorValue() == null)
         {
             // 状況に合わせて変更してください
             return new TimeSpan();
         }
         var value = base.GetEditorValue().ToString();
         if (Regex.IsMatch("^[0-9]{4}$", value))
         {
             var hours = value.Substring(0, 2);
             var minutes = value.Substring(2, 2);
             return new TimeSpan(int.Parse(hours), int.Parse(minutes), 0);
         }
         // 状況に合わせて変更してください
         return new TimeSpan();
     }

     public override bool StopEditing()
     {
         if(GetEditorValue() == null)
         {
             return false;
         }
         // チェックが必要な場合は必要に応じて追加してください
         base.FireEditingStop();
         return true;
     }
}

マスク型セルを使用してユーザの時刻フォーマットしか入力できないようにしています。
テキスト型セルを使っても作れるのですが、テキスト型だと時間と分の間の:をユーザが手動で入力しないといけないのでマスク型が適しているのではないかと思います。

今回はHH:mm形式にしましたが、HH:mm:ssなどに応用することもできます。

Discussion