none
MaskedTextBox の時刻の表示がおかしい。 → VB.NET 2005 RRS feed

  • 質問

  • MaskedTextBox の時刻の表示がおかしい。

    たとえば 画面のデザインで マスクの設定で 「h:mm] ex.[9:40]
    となるよう 設定した場合

    実行してみると 「09:40」 を入力 すると 「94:0_」 になってしまいます。
    対処方法 ご存知でしたらお願いします。 
    保存されるデータは正しく設定はされてます。

    2009年8月2日 14:50

回答

  • >  「形式の種類」にて 「日付と時刻」 → (ex. 11:24 ) を設定します。

    とした場合、9:40という値が返ります。これをマスクに当てはめれば、:は数字ではないので無視されますから、940がセットされることと同じであり、結果的に94:0になるのでしょう。
    マスクで90:00となっている以上、常に数字4ケタが必要です。
    したがって、

    >  「形式の種類」にて 「日付と時刻」 → (ex. 11:24 ) を設定します。

    ではなく、カスタムでHHmmと指定すれば常に4ケタが返るのでうまくいきます。
    しかし、その代わり頭に0が付きます。個人的にはこれでも違和感が無いのですが、もしこの0が付くのが嫌であれば、BindingのFormatイベントやParseイベントで変換するようにすれば、うまくいくのではないかと思います。
    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://blogs.wankuma.com/trapemiya/
    • 回答としてマーク MYNOBU 2009年8月3日 8:32
    2009年8月3日 7:12
    モデレータ

すべての返信

  • 実際にMaskプロパティ には何を指定したのでしょうか?
    チュートリアル があるので、それに従って操作してみてください。特に「...」を押す辺りを重点的に。
    2009年8月2日 22:00
  • マスクの設定はどこでされましたか? Maskプロパティに「h:mm]を指定された場合、何も入力できなくなってしまいます。
    仮にMaskプロパティに「h:mm]を指定された場合、「その他のすべての文字」に相当します。
    佐祐理さんも書かれていますが、以下のページでマスク要素をよく確認してみて下さい。

    MaskedTextBox.Mask プロパティ
    http://msdn.microsoft.com/ja-jp/library/system.windows.forms.maskedtextbox.mask.aspx


    以下に時刻のマスク例があります。

    .NET 2.0で新登場するWindowsコントロール
    http://www.atmarkit.co.jp/fdotnet/special/win20review01/win20review01_01.html
    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://blogs.wankuma.com/trapemiya/
    2009年8月3日 1:21
    モデレータ
  • MaskedTextBoxに時刻マスク(h:mm)はありません。
    MaskedTextBoxのタスク(コントロールのところに表示される>印)からマスクの設定で時刻を選んでみて下さい。


    http://blogs.wankuma.com/hatsune/
    2009年8月3日 1:57
  • 回答ありがとうございます。

    不正確な質問でした。

    マスクは 「時間」 → [90:00] です。 ほかにも [00:00],[#0:00] でもだめでした。

    バインドしているのは SQl server 2005 のデータで 項目は DateTime 型です。

    どうも DateTime 型 だとうまくいかないようです。

    バインドをはずすと 正確な情報が表示しています。 Text型 じゃないとだめなのでしょうか?

    2009年8月3日 2:17
  • Maskプロパティの値もバインドされていることも書かれていませんでしたし、バインドを外すと正常動作することも書かれていませんでした。
    質問の内容が全く違うように思います。

    方法 : MaskedTextBox コントロールにデータをバインドする を読むと、BindingのFormatイベントとPaseイベントを設定しています。
    MaskedTextBoxの問題というよりBindingの問題だったりしませんか?

    # と言っても、どうバインドしてあるのかがまた書かれていないわけですが。
    2009年8月3日 2:55
  • 祐理 ユーザーのメダルユーザーのメダルユーザーのメダルさま
    >>Maskプロパティの値もバインドされていることも書かれていませんでしたし、バインドを外すと正常動作することも書かれていませんでした。
    >>質問の内容が全く違うように思います。
    お説ごもっともです。

    はずすととかバインドについては当初よりあとから気づいたことですので ご勘弁を。

    下記に補足を書きます。

    さて、設定方法ですが データセットデザイナで TableAdpter が定義しています。 この場合 ①(TBL_交信記録TableAdaper) です。

    データソース にて ①の TBL_交信記録の項目( 開始時刻) について 右側のプルダウンにてMaskedTextBox にします。

    フォームデザイナ にて データソース にて ①の TBL_交信記録の項目( 開始時刻) を 配置します。 ドラッグ&ドロップ

    次に 配置した 開始時刻MaskedTextBOX の 右隅の三角矢印をクリックしてマスク設定します。 → (時間 90:00)


     開始時刻MaskedTextBOX のプロパティにて バインド(Datbinding) の詳細(・・・) をクリック 

      「形式の種類」にて 「日付と時刻」 → (ex. 11:24 ) を設定します。

    以上です。
    2009年8月3日 3:44
  • >  「形式の種類」にて 「日付と時刻」 → (ex. 11:24 ) を設定します。

    とした場合、9:40という値が返ります。これをマスクに当てはめれば、:は数字ではないので無視されますから、940がセットされることと同じであり、結果的に94:0になるのでしょう。
    マスクで90:00となっている以上、常に数字4ケタが必要です。
    したがって、

    >  「形式の種類」にて 「日付と時刻」 → (ex. 11:24 ) を設定します。

    ではなく、カスタムでHHmmと指定すれば常に4ケタが返るのでうまくいきます。
    しかし、その代わり頭に0が付きます。個人的にはこれでも違和感が無いのですが、もしこの0が付くのが嫌であれば、BindingのFormatイベントやParseイベントで変換するようにすれば、うまくいくのではないかと思います。
    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://blogs.wankuma.com/trapemiya/
    • 回答としてマーク MYNOBU 2009年8月3日 8:32
    2009年8月3日 7:12
    モデレータ
  • trapemiyaさん お返事ありがとうございます。

    さて、trapemiyaさんの内容で動作の確認をいたしました。

    >>カスタムでHHmmと指定すれば常に4ケタが返るのでうまくいきます。

    開始時刻の項目ですが DateTime型 ですので 頭に [1899/01/01] がついて たとえば [1899/01/01 09:40:00] で

    データが書き込まれています。

    この状態でテストすると 入力 validated 直後では 確かに 09:40 となっていますが Row に書き込まれた段階で

    18:99 になってしまいます。 たぶん 先頭の4桁が 表示されているのだと思います。

    まだ、修行がたりないのか理解が及んでいないようです。

    2009年8月3日 9:24
  • 私の方でBindingNavigatorで保存する分には、データベースに正しく書きこまれています。
    Rowに書きこまれた段階と書かれていますが、これは具体的には何を指すのでしょうか?


    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://blogs.wankuma.com/trapemiya/
    2009年8月4日 5:20
    モデレータ