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

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

新規登録して質問してみよう
ただいま回答率
85.50%
C#

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

WPF

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

Q&A

解決済

1回答

16652閲覧

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

---stax---

総合スコア148

C#

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

WPF

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

0グッド

1クリップ

投稿2017/10/03 07:28

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

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

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

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"です。
カレンダーを開けばその日付が選択されます。カレンダーではなく、他のコントロールへフォーカスを移動すると、修正された日時で上書きします。

XAML

1<Window x:Class="WpfApp1.MainWindow" 2 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 3 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 4 xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 5 xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 6 xmlns:local="clr-namespace:WpfApp1" 7 mc:Ignorable="d" 8 Title="MainWindow" Height="200" Width="300"> 9 <Grid> 10 <DatePicker x:Name="DatePicker1" HorizontalAlignment="Left" Margin="10,30,0,0" VerticalAlignment="Top" Height="24" Width="170" 11 DateValidationError="DatePicker1_DateValidationError" 12 /> 13 <TextBox x:Name="TextBox1" HorizontalAlignment="Left" Height="24" Margin="20,70,0,0" Text="" VerticalAlignment="Top" Width="120"/> 14 <Button x:Name="Button1" Content="Button" HorizontalAlignment="Left" Margin="20,110,0,0" VerticalAlignment="Top" Width="75" Click="Button1_Click"/> 15 </Grid> 16</Window> 17

C#

1using System; 2using System.Diagnostics; 3using System.Windows; 4using System.Windows.Controls; 5 6namespace WpfApp1 7{ 8 public partial class MainWindow : Window 9 { 10 public MainWindow() 11 { 12 InitializeComponent(); 13 } 14 15 // 不正な日時を入力した場合、確定のタイミングで呼び出される 16 private void DatePicker1_DateValidationError(object sender, DatePickerDateValidationErrorEventArgs e) 17 { 18 Debug.WriteLine("DatePicker1_DateValidationError: "); 19 if (sender is DatePicker) 20 { 21 DatePicker picker = (DatePicker)sender; 22 23 Debug.WriteLine("DatePicker.Text: " + picker.Text); 24 25 // DateTime値に変換する文字列 26 string s1 = "2017/10/04 12:34:56"; 27 28 // 文字列をDateTimeに 29 DateTime dt1 = DateTime.Parse(s1); 30 31 try 32 { 33 // 入力された"yyyyMMdd"書式での日付でDateTimeに変換 34 dt1 = System.DateTime.ParseExact(picker.Text, "yyyyMMdd", 35 System.Globalization.DateTimeFormatInfo.InvariantInfo, 36 System.Globalization.DateTimeStyles.None); 37 } 38 catch (Exception ex) 39 { 40 ; 41 } 42 43 // DatePicker用のDateTimeをセット 44 picker.SelectedDate = dt1; 45 Debug.WriteLine("#2Text: " + picker.Text); 46 } 47 } 48 49 private void Button1_Click(object sender, RoutedEventArgs e) 50 { 51 var format = DatePicker1.SelectedDateFormat; 52 Debug.WriteLine("Format: " + format.ToString()); 53 54 Debug.WriteLine("DatePicker1.Text: " + DatePicker1.Text); 55 } 56 } 57} 58

投稿2017/10/04 14:35

編集2017/10/05 12:02
dodox86

総合スコア9183

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

---stax---

2017/10/05 23:42

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

2017/10/10 01: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; }
---stax---

2017/10/10 02:04

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

2017/10/10 02:40 編集

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を継承すればそれができるかどうかは分かりません。またその方法を提示するのはの回答の範囲を超えてしまいますのでご容赦ください。
dodox86

2017/10/10 02:44

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問