質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.76%

  • C#

    6581questions

    C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

  • WPF

    658questions

    Windows Presentation Foundation (WPF) は、魅力的な外観のユーザー エクスペリエンスを持つ Windows クライアント アプリケーションを作成するための次世代プレゼンテーション システムです

C# WPF DataPickerを用いた日付入力の表示について

解決済

回答 1

投稿

  • 評価
  • クリップ 1
  • VIEW 1,632

---stax---

score 60

表題の件について質問させてください
現在画面に任意の日付を入力できて表示もできるようにしたいと考えています
DataPickerを使用すればいいのかなと思うのですが
2017/10/03
という入力をすれば反映されるのですが、
20171003
という表示では反映されません
上記のような入力の仕方でも2017/10/03のようにyyyy/mm/ddの形式に変換することはできますか?

コードに関しては当方プログラミングを始めたばかりでコードも書くことが出来ていないため投げっぱなしの質問になってしまい申し訳ありませんがアドバイスよろしくお願いいたします

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

+2

DatePickerに入力された日時文字列を制御するには、DatePickerのプロパティをセットするだけでは思惑通りの結果は得られないようです。
ご質問の件に完全に合致しているか少々確証が持てなかったのですが、一応できることを確認しましたのでサンプルコードをご紹介します。

DatePickerのテキストボックス部分に"yyyyMMdd"のように不正な日時文字列を入力すると、DatePicker.DateValidationError を言うイベントが発生して、親のウィンドウへ通知されます。

このイベントの中で不正な文字列を修正し、適切なDateTime型に変換してDatePickerにセットすることでカレンダーを表示したときでもその日付にセットされます。
ただし、適切なDateTimeをセットした時点でDatePickerのテキスト部分はyyyy/MM/dd 形式に変換されて表示されます。それで良ければ、ご要望に沿えると思います。

もし、複数のDatePickerを同じような挙動にしたい場合は、DatePickerを継承してDateValidationErrorイベントをその中で処理した方が良いかもしれません。

コードとXAMLを以下に示します。Visual Studio 2017 で確認しました。

デモでは、DatePicker に 不正日付文字列を入力すると、"yyyyMMdd"の部分を取り出して使います。初期値は"2017/10/04 12:34:56"です。
カレンダーを開けばその日付が選択されます。カレンダーではなく、他のコントロールへフォーカスを移動すると、修正された日時で上書きします。

<Window x:Class="WpfApp1.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:WpfApp1"
        mc:Ignorable="d"
        Title="MainWindow" Height="200" Width="300">
    <Grid>
        <DatePicker x:Name="DatePicker1" HorizontalAlignment="Left" Margin="10,30,0,0" VerticalAlignment="Top" Height="24" Width="170"
                    DateValidationError="DatePicker1_DateValidationError"
        />
        <TextBox x:Name="TextBox1"  HorizontalAlignment="Left" Height="24" Margin="20,70,0,0" Text="" VerticalAlignment="Top" Width="120"/>
        <Button x:Name="Button1" Content="Button" HorizontalAlignment="Left" Margin="20,110,0,0" VerticalAlignment="Top" Width="75" Click="Button1_Click"/>
    </Grid>
</Window>
using System;
using System.Diagnostics;
using System.Windows;
using System.Windows.Controls;

namespace WpfApp1
{
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }

        // 不正な日時を入力した場合、確定のタイミングで呼び出される
        private void DatePicker1_DateValidationError(object sender, DatePickerDateValidationErrorEventArgs e)
        {
            Debug.WriteLine("DatePicker1_DateValidationError: ");
            if (sender is DatePicker)
            {
                DatePicker picker = (DatePicker)sender;

                Debug.WriteLine("DatePicker.Text: " + picker.Text);

                // DateTime値に変換する文字列
                string s1 = "2017/10/04 12:34:56";

                // 文字列をDateTimeに
                DateTime dt1 = DateTime.Parse(s1);

                try
                {
                    // 入力された"yyyyMMdd"書式での日付でDateTimeに変換
                    dt1 = System.DateTime.ParseExact(picker.Text, "yyyyMMdd",
                                System.Globalization.DateTimeFormatInfo.InvariantInfo,
                                System.Globalization.DateTimeStyles.None);
                }
                catch (Exception ex)
                {
                    ;
                }

                // DatePicker用のDateTimeをセット
                picker.SelectedDate = dt1;
                Debug.WriteLine("#2Text: " + picker.Text);
            }
        }

        private void Button1_Click(object sender, RoutedEventArgs e)
        {
            var format = DatePicker1.SelectedDateFormat;
            Debug.WriteLine("Format: " + format.ToString());

            Debug.WriteLine("DatePicker1.Text: " + DatePicker1.Text);
        }
    }
}

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/10/06 08:42

    回答ありがとうございます
    返事が遅くなってすいません
    さっそくいただいたサンプルを試してみます
    また分からないことがあれば質問させていただきます
    よろしくお願いいたします

    キャンセル

  • 2017/10/10 10:37

    お世話になっております
    質問させてください
    現在A,Bというラジオボタンが画面にあり、Aのボタンが選択されているときはDatePickerの書式をYYYY/MM/DDにする
    Bのボタンが選択されている場合はYYYY/MM/DD HH:mm:ssという書式にしようと考えています
    いただいたコードを参考に作ってみたのですが、書式を変換した後、DatePickerに表示させる方法が分からず苦戦しています・・・
    よろしければアドバイスをお願いいたします

    private void DatePickerSelectDateChanged(object sender, RoutedEventArgs e)
    {
    var datepicker = (DatePicker)sender;
    string datenow = DateTime.Now.ToString();
    DateTime dt = DateTime.Parse(datenow);

    //Aボタン(yyyy/mm/dd)
    if (A.IsChecked == true)
    {

    dt = DateTime.ParseExact(datepicker.Text, "yyyy/MM/dd ", null);
    datepicker.SelectedDate = dt;


    }


    //Bボタン(yyyy/mm/dd HH:mm:ss)
    if (B.IsChecked == true)
    {

    dt = DateTime.ParseExact(datepicker.Text, "yyyy/MM/dd HH:mm:ss", null);
    datepicker.SelectedDate = dt;



    }

    キャンセル

  • 2017/10/10 11:04

    今回選択ボタンで書式を変更させようと考えたのですが、一般的にはcangeイベントなどで書式を変えるなどしたほうがよいのでしょうか?

    キャンセル

  • 2017/10/10 11:39 編集

    DatePickerのTextBox(?)自体の表示の書式は自由自在には変えられないようです。SelectedDateFormatでのLongとShortの指定も、日付部分だけの影響に留まります。
    回答でご提示させてもらった方法は、本来はDatePickerでの日付入力としては不正な形式(yyyyMMdd)は、カレンダーや、他のコントロールへ移動するときにDateValidationErrorイベントが発生するので、その時に正式な形式 "yyy/MM/dd..."に変更して、picker.SelectedDate へセットする、とのものになります。そう言った意味でもあり、回答では「表示する」とは書きませんでした。

    ですので、例えばカレンダーで指定した日付を"yyyy/MM/dd HH:mm:ss"形式でDatePicker上のTextBoxに表示させることはできません。あくまで、DatePickerは Date=日付 のみの扱いとなるようです。この制限で----t----様の開発するソフトの要求仕様を満たせないのであれば、DatePickerに類似したカスタムコントロールを作成する必要があるかと思います。DatePickerを継承すればそれができるかどうかは分かりません。またその方法を提示するのはの回答の範囲を超えてしまいますのでご容赦ください。

    キャンセル

  • 2017/10/10 11:44

    選択ボタンで書式を変更するときにChange相当のイベントで変えるべきかどうかは、選択ボタンを押したときにリアルタイムに表示を更新する必要があるかどうか、によるかと思います。そこまでする必要が無ければ、Change相当イベントをそれぞれハンドリングするほどのことは無いかと。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.76%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • C#

    6581questions

    C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

  • WPF

    658questions

    Windows Presentation Foundation (WPF) は、魅力的な外観のユーザー エクスペリエンスを持つ Windows クライアント アプリケーションを作成するための次世代プレゼンテーション システムです