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

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

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

DateTimePicker.Textの更新方法

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

■94773 / inTopicNo.1)  DateTimePicker.Textの更新方法
  
□投稿者/ 手間 (1回)-(2020/05/16(Sat) 15:54:04)

分類:[.NET 全般] 

VB2015に関する質問です。

まず、
TabControlをフォーム上に作成し、
ページ数を2ページに変更します。

一ページ目にDateTimePicker1を生成し、
二ページ目にDateTimePicker2を生成します。


一ページ目にボタンを作成し、その中にプログラムを書きます。


そして、プログラムを起動後、ボタンを押してプログラムから

DateTimePicker1.TextとDateTimePicker2.Textを呼び出そうとすると
DateTimePicker1.Textには"0:00:00"が代入されているのですが、
DateTimePicker2.Textには""となっており、値が代入されていません。

一度タブページの2ページ目を開かないと
DateTimePicker.Textに値が代入されないようです。

プログラム上で、
DateTimePicker.Textの更新を行いたいのですが
どのようにすれば良いですか?


DateTimePicker2.ResetText()
DateTimePicker2.Refresh()
DateTimePicker2.Update()

の辺りを試してみましたが、
いずれも反映されませんでした。

どのコードを使えば良いですか?


引用返信 編集キー/
■94774 / inTopicNo.2)  Re[1]: DateTimePicker.Textの更新方法
□投稿者/ Hongliang (1029回)-(2020/05/16(Sat) 16:12:31)
DateTimePickerは、Textプロパティを通して文字列で扱うのではなく、Valueプロパティを通してDateTimeで扱うべきだとは思いますが。

DateTimeのTextプロパティはWM_GETTEXTを投げてるだけなので、ウィンドウハンドルが作成されない間は空文字列になります。
であるので、ウィンドウハンドルを強制的に作成すれば取得できるようになります。
Handleプロパティを取得することで強制的に作成させられるので、
Dim handle = DateTimePicker2.Handle
の1行をTextを取得する前に実行されるどこかに書いておけばいいです。

重ねて言いますが、Valueプロパティを使ってDateTimeで扱うべきです。
こんな無駄なハックも必要なくなりますし。
引用返信 編集キー/
■94775 / inTopicNo.3)  Re[2]: DateTimePicker.Textの更新方法
□投稿者/ 手間 (2回)-(2020/05/16(Sat) 16:20:54)
ありがとうございます。
うまくいきました。

> 重ねて言いますが、Valueプロパティを使ってDateTimeで扱うべきです。

これに関してなのですが、
DateTimePickerは表示フォーマットをFomartのところで変更することができますが、
ここで設定したフォーマットに従って、ValueプロパティをTextに変換した文字列を取得するにはどうしたら良いですか?

引用返信 編集キー/
■94776 / inTopicNo.4)  Re[3]: DateTimePicker.Textの更新方法
□投稿者/ Hongliang (1030回)-(2020/05/16(Sat) 17:09:50)
> DateTimePickerは表示フォーマットをFomartのところで変更することができますが、
> ここで設定したフォーマットに従って、ValueプロパティをTextに変換した文字列を取得するにはどうしたら良いですか?
直接DateTimePickerには用意されていませんね。
多分こんな拡張メソッドでいいはずです。

Module DateTimePickerExtension
  <System.Runtime.CompilerServices.Extension()> _
  Public Function GetText(ByVal picker As DateTimePicker) As String
    Dim fmt As String
    Select Case picker.Format
    Case DateTimePickerFormat.Long
      fmt = "D"
    Case DateTimePickerFormat.Short
      fmt = "d"
    Case DateTimePickerFormat.Time
      fmt = "T"
    Case Else
      fmt = picker.CustomFormat
    End Select
    Return picker.Value.ToString(fmt, System.Globalization.CultureInfo.CurrentUICulture)
  End Function
End Module

' こんな感じで呼び出せます
Dim text = DateTimePicker2.GetText()

引用返信 編集キー/
■94777 / inTopicNo.5)  Re[3]: DateTimePicker.Textの更新方法
□投稿者/ とっちゃん (683回)-(2020/05/16(Sat) 17:14:08)
No94775 (手間 さん) に返信

> DateTimePickerは表示フォーマットをFomartのところで変更することができますが、
> ここで設定したフォーマットに従って、ValueプロパティをTextに変換した文字列を取得するにはどうしたら良いですか?
>
このあたりですかね?

DateTime や DateTimeOffset などの書式化に関するドキュメントです。

https://docs.microsoft.com/ja-jp/dotnet/standard/base-types/standard-date-and-time-format-strings?view=netcore-3.1

引用返信 編集キー/
■94778 / inTopicNo.6)  Re[4]: DateTimePicker.Textの更新方法
□投稿者/ 手間 (4回)-(2020/05/16(Sat) 18:11:30)
ありがとうございます。

簡単なコードは用意されていないのですね。
それなら、
Dim handle = DateTimePicker2.Handle
の方が一行で済むのでシンプルではないかと思いました。

Dim handle = DateTimePicker2.Handleが推奨されない理由は何なのでしょうか?
これがハックに当たるというのはなぜですか?

引用返信 編集キー/
■94779 / inTopicNo.7)  Re[5]: DateTimePicker.Textの更新方法
□投稿者/ Hongliang (1031回)-(2020/05/16(Sat) 18:35:58)
まあ突き詰めると個人の感想ですになるわけですが、大体以下のような理由ですかね。
・Handleを作らないとTextが取得できないというの自体、知っていないと解が出せない(調べても分からない)類の問題
 ・つまり内部実装依存であり今後も同じとは限らない(現実には変わることはないとしても)
・Handleを取得してそのまま無視するのが気持ち悪い
・そもそもDateTimePickerの表示と同じ文字列を取得する意味があると思わない
 ・これまでの経験上、それを要求されたことはなかったなぁ
引用返信 編集キー/
■94780 / inTopicNo.8)  Re[6]: DateTimePicker.Textの更新方法
□投稿者/ 手間 (5回)-(2020/05/17(Sun) 20:23:29)
納得しました
どうもありがとうございました

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

このトピックをツリーで一括表示


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

このトピックに書きこむ