表題の件について質問させてください
現在画面に任意の日付を入力できて表示もできるようにしたいと考えています
DataPickerを使用すればいいのかなと思うのですが
2017/10/03
という入力をすれば反映されるのですが、
20171003
という表示では反映されません
上記のような入力の仕方でも2017/10/03のようにyyyy/mm/ddの形式に変換することはできますか?
コードに関しては当方プログラミングを始めたばかりでコードも書くことが出来ていないため投げっぱなしの質問になってしまい申し訳ありませんがアドバイスよろしくお願いいたします
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。

回答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総合スコア9369
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/10/05 23:42
2017/10/10 01:37
2017/10/10 02:04
2017/10/10 02:40 編集
2017/10/10 02:44