DataTimePicker mit CultureInfo

  • VB.NET

Es gibt 42 Antworten in diesem Thema. Der letzte Beitrag () ist von us4711.

    DataTimePicker mit CultureInfo

    Moin Leute,
    für ein Multi-Language-Projekt muss die Ausgabe eines DateTimePickers der vorgegebenen Kultur entsprechen. Als Grundlage habe ich diesen StackOverflow-Artikel verwendet.
    Ich habe ein Testprojekt mit 2 DateTimePickern, einer englisch, einer deutsch formatiert und mit einem NumericUpDown ändere ich die Formate.
    1. ein unschöner Effekt: die Formate der deutsche und der englische Formatliste sind nicht äquivalent sortiert (vernachlässigbar),
    2. womöglich ein Fehler: bei einigen Formaten (bei beiden z.B. Nr. 7) werden 2 oder mehr Texte ausgegeben, die einzeln fokussiert werden können, die sich überlagern, die aber in der .Text-Property so abgegriffen werden können:

    Hat jemand von Euch eine Idee, wie das Datum ordentlich ausgegeben werden kann?
    Dieses Problem ist offensichtlich unabhängig vom Framework, allerdings nicht die Ausprägung (bei welcher Formatnummer der Effekt auftritt).
    DateTimePickerCulture.zip
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    @RodFromGermany
    Mit dtp??.value.GetDateTimeFormats(Culturinfo) ermittelst Du NICHT Formatinformationen, die Du mit CustomFormat verwenden kannst, sondern vielmehr die möglichen Repräsentationen des dtp??.value Wertes der angegebenen CulturInfo.
    Schau' Dir mal z.B. in Zeile 35 die Werte des String-Arrays formats an ...
    @ErfinderDesRades
    Na ja, in Zeile 38 (z.B.) wird ja auch immer wieder das aktuelle Datum zugewiesen ...

    ErfinderDesRades schrieb:

    focussieren
    diesen hier z.B.:

    -----
    @us4711 Das ist die Vorgabe von StackOverflow.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    wie gesagt - geht bei mir nicht.
    Aber ich denke, us4711 hat den Grund bereits genannt:

    us4711 schrieb:

    mit ... ermittelst Du NICHT Formatinformationen
    Daher weist du dem DTP ungültige CustomFormate zu, und da muss sich niemand mehr wundern.

    Gültige Formate einer Kultur kriegst du über die

    Objectbrowser schrieb:

    Public Overridable Property DateTimeFormat As System.Globalization.DateTimeFormatInfo
    Member of System.Globalization.CultureInfo
    - also ich vermute jdfs., dass du mit diesen etwas vorhast (dem Stackoverflow-Kram bin ich nun nicht gefolgt).

    ErfinderDesRades schrieb:

    Gültige Formate einer Kultur
    Das ist alles etwas merkwürdig.
    Mit diesen beiden

    VB.NET-Quellcode

    1. dtpEn.CustomFormat = "dddd, MMMM dd yyyy"
    2. dtpEn.CustomFormat = culture.DateTimeFormat.LongDatePattern ' "dddd, MMMM d, yyyy"
    bringt er deutsche Tages- und Monatsnamen, mit den "falschen" Werten stimmt zuminsdest die Sprache. :/
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    ErfinderDesRades schrieb:

    Haltepunkt
    Hatte ich bereits:
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Das sind "richtige" Werte, die du da debuggst. Aber debug mal die "falschen" Werte.

    Wobei ich unter "falchen Werte" das verstanden hab, was Date.Now.GetTimeFormats() returnt, entsprechend deines Testprojekts.

    Das Fehlverhalten unter der mutmaßlichen Code-Änderung muss ich jetzt erst noch versuchen zu reproduzieren.

    Edit: Ah - habs glaub.
    Also der Dtp nimmt als Beschriftungs-Sprache die Sprache der CurrentUICulture, also die Sprache, die für die aktuelle Anwendung eingestellt ist.

    Das Lokalisierungs-Konzept von MS sieht eiglich nicht vor, dass innerhalb einer Anwendung die Kultur umgeschaltet wird, oder das Controls derselben Laufzeit unterschiedlich lokalisiert sind.

    Wie hier erwähnt:
    activevb.de/cgi-bin/tippupload/show/106/Lokalisierung
    ist eiglich vorgesehen, für jede unterstützte Sprache ein komplett eigenes Design zu designen.

    Daher stimmt die Sprache schon - ich hab mir die verschiedenen Formatstrings ausgeben lassen

    VB.NET-Quellcode

    1. Dim frm = culture.DateTimeFormat.LongDatePattern
    2. dtp.CustomFormat = culture.DateTimeFormat.LongDatePattern
    3. Console.WriteLine(culture.ToString & ": " & frm)

    Quellcode

    1. de-DE: dddd, d. MMMM yyyy
    2. en-US: dddd, MMMM dd, yyyy
    Sieht natürlich bescheuert aus, ein mit englischem Formatstring formatiertes Datum mit deutschen Tages-/Monat-Namen

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „ErfinderDesRades“ ()

    ErfinderDesRades schrieb:

    die "falschen" Werte
    sind mit aktuellen DateTime.Now-Werten ausgefüllt, ebenso wie DateTime.Now.GetDateTimeFormats.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    ICh weiß nicht ob's das ist was Du willst, hab auf die Form einen Datetimepicker geklatscht und den Code wie folgt geändert:

    Spoiler anzeigen

    VB.NET-Quellcode

    1. Imports System.Globalization
    2. Public Class Form1
    3. Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    4. 'nix
    5. End Sub
    6. Private Sub Form1_Shown(sender As Object, e As EventArgs) Handles MyBase.Shown
    7. SetLblDe(0)
    8. SetLblEn(0)
    9. End Sub
    10. Private Sub NumericUpDown1_ValueChanged(sender As Object, e As EventArgs) Handles NumericUpDown1.ValueChanged
    11. SetLblDe(CInt(NumericUpDown1.Value))
    12. SetLblEn(CInt(NumericUpDown1.Value))
    13. End Sub
    14. Private Sub SetLblDe(nr As Integer)
    15. ' die aktuelle Kultur erstellen
    16. Dim culture = New CultureInfo("de-DE")
    17. System.Threading.Thread.CurrentThread.CurrentCulture = culture
    18. System.Threading.Thread.CurrentThread.CurrentUICulture = culture
    19. Application.CurrentCulture = culture
    20. ' Wert zuweisen
    21. Dim dtCurrent As New DateTime
    22. dtCurrent = DateTimePicker1.Value
    23. Dim dtCurrentFormats As String()
    24. dtCurrentFormats = dtCurrent.GetDateTimeFormats(Application.CurrentCulture)
    25. Label1.Text = dtCurrentFormats(nr)
    26. End Sub
    27. Private Sub SetLblEn(nr As Integer)
    28. ' die aktuelle Kultur erstellen
    29. Dim culture = New CultureInfo("en-US")
    30. System.Threading.Thread.CurrentThread.CurrentCulture = culture
    31. System.Threading.Thread.CurrentThread.CurrentUICulture = culture
    32. Application.CurrentCulture = culture
    33. ' Wert zuweisen
    34. Dim dtCurrent As New DateTime
    35. dtCurrent = DateTimePicker1.Value
    36. Dim dtCurrentFormats As String()
    37. dtCurrentFormats = dtCurrent.GetDateTimeFormats(Application.CurrentCulture)
    38. Label2.Text = dtCurrentFormats(nr)
    39. End Sub
    40. End Class

    Dksksm schrieb:

    wie folgt geändert
    Leider vergebliche Lebensmüh, der Output ist der fortmatierte Datum-Zeit-Wert, nicht aber der Format-String:
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    Dksksm schrieb:

    aufzubauen und die zu verwenden

    RodFromGermany schrieb:

    Das ist alles etwas merkwürdig.Mit diesen beiden

    VB.NET-Quellcode

    1. dtpEn.CustomFormat = "dddd, MMMM dd yyyy"
    2. dtpEn.CustomFormat = culture.DateTimeFormat.LongDatePattern ' "dddd, MMMM d, yyyy"
    bringt er deutsche Tages- und Monatsnamen
    :/
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Das sind die genau die Formatierungen die hinhauen und über die man auch immer stolpert.

    Hast Du den Kommentar gelsene zu dem StackOverflow Artikel auf den Du Dich beziehst?
    GetDateTimeFormats() does not produce format strings (that can be used to do formatting), but formatted strings (the result of formatting). Assigning such a string to .CustomFormat makes no sense. Would vote down answer, but lacking reputation myself... – Peter B Jul 29 '14 at 14:51

    MSDN schreibt hier dazu auch:
    The string array returned by the DateTime.GetDateTimeFormats() method is equivalent to combining the string arrays returned by separate calls to the DateTime.GetDateTimeFormats(Char)
    method with the "d", "D", "f", "F", "g", "G", "m", "o", "r", "s", "t",
    "T", "u", "U", and "y" standard format strings. For more information
    about standard format specifiers, see Standard Date and Time Format Strings.
    Es scheint wirklich so zu sein, das sich das Anzeigeverhalten des dtp nicht durch eine Änderung der Culturinfo des aufrufenden Threads beeinflussen lässt.
    Workaround:

    VB.NET-Quellcode

    1. Private Sub dtpEn_ValueChanged(sender As Object, e As EventArgs) Handles dtpEn.ValueChanged
    2. Dim culture = New CultureInfo("en-US")
    3. Dim formats As String() = dtpEn.Value.GetDateTimeFormats(culture)
    4. Label2.Text = formats(NumericUpDown1.Value)
    5. End Sub

    Damit erhält man zumindest ein dem Wunsch entsprechend formatiertes Datum, das auch die Wochentage in der Sprache der Culture anzeigt.