DateTimePicker Anzeige Sprache?

  • VB.NET
  • .NET 7–8

Es gibt 20 Antworten in diesem Thema. Der letzte Beitrag () ist von Dideldum.

    DateTimePicker Anzeige Sprache?

    Hi Ihr Profis,

    Der Link:
    Formatierung DateTimePicker
    hilft mir wohl nicht bei meinem Problem?

    ich habe inzwischen mein gesamtes Projekt in Deutsch/Englisch (vorerst nur diese beide Sprachen) in den Einstellungen meines Proggis manuell umschaltbar gebaut.
    Das funktioniert auch wunderbärchen mit allen Controls und Ausgaben.

    Nur leider nicht mit den $&%§-DateTimePickern, die das Datum im LongDatePattern-Format anzeigen (z.B. "Samstag, 13. Januar 2024").
    Diese bekomme ich nicht mit guten Worten noch mit Gewalt dazu, meine in My.Settings.ICE_Sprache ("de" oder "en") hinterlegte Sprache anzunehmen.
    Gibt es für diese Controls eine Lösung, meine manuelle Sprachauswahl anzunehmen und bei ICE_Sprache = "en" dann auch "Saturday, January 13 2024" anzuzeigen?

    Meine Versuche u.a.:

    VB.NET-Quellcode

    1. Select Case My.Settings.ICE_Sprache
    2. Case "de"
    3. Thread.CurrentThread.CurrentCulture = New CultureInfo("de-DE")
    4. Thread.CurrentThread.CurrentUICulture = New CultureInfo("de-DE")
    5. Case "en"
    6. Thread.CurrentThread.CurrentCulture = New CultureInfo("en-US")
    7. Thread.CurrentThread.CurrentUICulture = New CultureInfo("en-US")
    8. Case Else
    9. Thread.CurrentThread.CurrentCulture = CultureInfo.CurrentCulture
    10. Thread.CurrentThread.CurrentUICulture = CultureInfo.CurrentCulture
    11. End Select
    12. Dtp_DatumVon.Format = DateTimePickerFormat.Custom
    13. Dtp_DatumVon.CustomFormat = CultureInfo.CurrentUICulture.DateTimeFormat.LongDatePattern
    14. Dtp_DatumBis.Format = DateTimePickerFormat.Custom
    15. Dtp_DatumBis.CustomFormat = CultureInfo.CurrentUICulture.DateTimeFormat.LongDatePattern


    führten zu keinerlei sichtbarem Erfolg.
    Die Ausgabesprache der DTP bleibt auf deutsch bzw. der Systemsprache.
    Aber ich möchte halt, dass die User mit deutschen oder anderen Systemsprachen manuell die UI-Sprache auch auf Englisch setzen können.
    Und da hakt es nur noch an diesen DTP-Controls.

    Mit:

    VB.NET-Quellcode

    1. Dtp_DatumVon.format = DateTimePickerFormat.Custom
    2. If my.settings.ice_sprache = "de" Then
    3. Dtp_DatumVon.CustomFormat = "dddd dd MMMM yyyy"
    4. Else
    5. Dtp_DatumVon.CustomFormat = "dddd MMMM dd yyyy"
    6. End If
    7. Dtp_DatumBis.format = DateTimePickerFormat.Custom
    8. If my.settings.ice_sprache = "de" Then
    9. Dtp_DatumBis.CustomFormat = "dddd dd MMMM yyyy"
    10. Else
    11. Dtp_DatumBis.CustomFormat = "dddd MMMM dd yyyy"
    12. End If

    Kann ich zwar die Anzeigereihenfolge von Tag, Monat, Jahr definieren - aber dennoch werden Wochentag und ausgeschriebener Monat in der Systemsprache ausgegeben.

    Kann mir dazu jemand einen Tip geben?
    Ich komme einfach nicht weiter

    Die DTPs sind im Designer in deren Forms gebaut, falls das relevant sein sollte. Werden also nicht zur Laufzeit generiert.

    EDIT: Die Sprachauswahl soll natürlich auch den DropDown-Kalender-Auswahl dieser DTPs beeinflussen.
    Es scheint so, als könnte das Standard-Tool die Sprache nicht wechseln; stattdessen verwendet es immer die Sprache des Betriebssystems (die eingestellte, zumindest).

    Aber das IMO auch gar nicht dramatisch. Mich würde das ja total ankotzen, wenn wegen eines Bugs plötzlich das Datum auf russisch gezeigt würde. Warum willst du denn, dass das Programm anders das Datum darstellt, als das Betriebssystem?
    Quellcode lizensiert unter CC by SA 2.0 (Creative Commons Share-Alike)

    Meine Firma: Procyon Systems
    Meine Privatwebseite: SimonC.eu

    Bitte nicht wundern, wenn meine Aktivitäten im Forum etwas langsamer sind, ich baue gerade mein Nebengewerbe zum Vollgewerbe aus.
    Ich versuche auf euch zurückzukommen :)
    @Dideldum
    Evtl bringt Dich dieses ein Stück weiter: codeproject.com/Articles/45684…h-Calendar-and-Datepicker

    Alternativ fällt mir nur noch Subclassing ein wo Du dann, bei entsprechender WM-Message, den Text austauscht. Also klassisches OwnerDrawing sozusagen.
    Mfg -Franky-

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

    Grüss Dich, @siycah
    Danke Dir für Deine Mess. Dann bin ich doch nicht zu dumm, die Sprache des DTP zu ändern - ich bin auch zu Deinem Schluss gekommen.
    M.E. hat MS da einfach gepennt. Denn stringent ist das eher nicht, dass sich nur ein Control der Sprachänderung mit CurrentUICulture verweigert.
    EDIT: Lustig ist, dass beim Wechsel der der CurrentUICulture der Value des Controls umgeschaltet wird - nur nicht die Anzeige des Controls mitzieht.
    Schade, denn ich habe inzwischen alles in meinem Projekt manuell umschaltbar, so dass der Benutzer unabhängig von der System-Culture die Sprache frei wählen kann.
    Das habe ich so gemacht, weil mein Projekt derzeit nur zwei Sprachen unterstützt.
    Wenn nun ein Benutzer eine nicht unterstützte Culture-Einstellung auf seinem Kisterl hat, kann er dann zwischen den beiden Sprachen auswählen und bekommt nicht zwangsweise die Default-"en-US" aufs Auge gedrückt - so mein Gedanke dahinter.

    @-Franky-
    Danke auch Dir! Dein Link ist sicher geeignet - allerdings auch ziemlich oversized für mein Projekt, scheint mir.
    Aber ich habe mir den Link gesichert.
    Wenn ich mal gaaaaaanz fertig bin, mit meinem Projekt und mir arg langweilig wird, schaue ich, ob ich das in mein Projekt einbauen und die Default DTPs damit ersetzen kann.
    Ich könnte meine DTPs solange ja auch auf ShortPatternFormat umstellen, dann wäre nur der Popup-Monatskalender in der falschen Sprache und nicht die gesamte Anzeige des Controls.
    Es stört derzeit ja nur, wenn im deutschsprachigen Raum die "en" ausgewählt wird und umgekehrt.
    Ist halt unschön und lässt den Benutzer Versäumisse des Coders vermuten.

    Dideldum schrieb:

    Danke Dir für Deine Mess.


    Ich muss ehrlich gestehen, als ich das las, hat mein innerer Brite kurz übernommen und ich war verwundert, welche Sauerei ich hinterlassen hatte ^^




    Ich hätte das an deiner Stelle etwas anders gemacht. .net unterstützt OOB Übersetzungen.
    learn.microsoft.com/en-us/dotn…e/extensions/localization

    Dann brauchst du dir keine weiteren Gedanken drum machen.
    Quellcode lizensiert unter CC by SA 2.0 (Creative Commons Share-Alike)

    Meine Firma: Procyon Systems
    Meine Privatwebseite: SimonC.eu

    Bitte nicht wundern, wenn meine Aktivitäten im Forum etwas langsamer sind, ich baue gerade mein Nebengewerbe zum Vollgewerbe aus.
    Ich versuche auf euch zurückzukommen :)
    Hi @siycah

    gracias für Deine Hilfe!
    Neee, mit "mess" meinte ich natürlich "message" - und nicht Müll. :)
    Sowas würde ich nie denken noch schreiben - bin ja dankbar für jede Hilfe!

    Ja, ich arbeite mit der Lokalisation und den Ressources-Files.
    Aber ich steuere eben die Umschaltung auch manuell und nicht nur per System-Vorgaben.
    D.h. Beim ersten Start übernimmt mein Projekt die CurrentCulture vom System und stellt diese in meinem Projekt ein (falls nicht als Ressource vorhanden, wird "en-US" als Default vorgegeben).
    Dann kann aber der Benutzer aber in den Programm-Einstellungen die Sprache manuell auswählen.
    Und eben an diesem Punkt scheitert der DTP.
    Der versteht mein Bedürfnis einfach nicht und verweigert die Übernahme der von mir eingestellten CurrentUICulture und CurrentCulture.
    Bzw - der DTP übernimmt diese zwar netterweise als Value-Format, aber nicht in seinem User-Control.
    Nicht mal, wenn ich zur Laufzeit den DTP remove und mit geänderter CurrentUICulture neu einbinde.
    Also lässt die CurrentCulture das UI des DTP total kalt - was ich so gar nicht verstehe.
    Denn m.W. ist die CurrentCulture doch immer die UI-Sprache der Windows-Umgebung und CurrentUICulture die der ganzen Windows-UI.
    Woher bezieht dann der DTP seine UI-Sprach-Einstellung?

    EDIT: Ich lebe in tiefen Süden des Landes und weiter südlich haben wir ein drei- oder mehrsprachiges Volk - die Schweizer.
    Da habe ich einen Kunden, der immer schimpfte, dass er mit seiner Französischen Windows-Oberfläche (er lebt in der französische Schweiz) automatisch alle Anwendungen in englischer Sprache vorgesetzt bekommt, wenn diese keine Ressources sw-fr (oder wie immer diese heisst) beinhalten.
    Ihm wäre hierbei eine deutsche UI in seinen Apps lieber, wenn die Anwendungen nur En-DE anbieten.
    Dies hat mich dazu bewogen, mein Proggi unabhängiger von den Win-Vorgaben zu gestalten.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Dideldum“ ()

    Und wieder der DateTimePicker...
    Ich habe nun auch einen DTP mit Format Custom.
    Dieser soll die Zeit folgendermassen anzeigen:

    VB.NET-Quellcode

    1. Select Case cob_ICE_Sprache.SelectedIndex
    2. Case 1
    3. tempSprache = "de"
    4. System.Threading.Thread.CurrentThread.CurrentCulture = New System.Globalization.CultureInfo("de-DE")
    5. System.Threading.Thread.CurrentThread.CurrentUICulture = New System.Globalization.CultureInfo("de-DE")
    6. Case 0
    7. tempSprache = "en"
    8. System.Threading.Thread.CurrentThread.CurrentCulture = New System.Globalization.CultureInfo("en-US")
    9. System.Threading.Thread.CurrentThread.CurrentUICulture = New System.Globalization.CultureInfo("en-US")
    10. End Select


    und

    VB.NET-Quellcode

    1. If tempSprache = "de" Then
    2. dtp_Ordner_Einstellungen_Erinnerung_Datum.CustomFormat = "dd.MM.yyyy"
    3. dtp_Ordner_Einstellungen_Erinnerung_Zeit.CustomFormat = "hh:mm:ss"
    4. Else
    5. dtp_Ordner_Einstellungen_Erinnerung_Datum.CustomFormat = "MM/dd/yyyy"
    6. dtp_Ordner_Einstellungen_Erinnerung_Zeit.CustomFormat = "hh:mm:ss tt"
    7. End If
    8. dtp_Ordner_Einstellungen_Erinnerung_Datum.Format = DateTimePickerFormat.Custom
    9. dtp_Ordner_Einstellungen_Erinnerung_Zeit.Format = DateTimePickerFormat.Custom


    Der Date-Picker schaltet auch brav zwischen DE und EN um.
    Aber der Time-Picker zeigt bei EN und "16:34:56" nicht "04:34:56 PM" an, sondern eben die "16:34:56"

    Kann ich den Time-Picker irgendwie dazu bewegen, das zu tun, was ich von ihm will?

    Beste Grüsse
    ein CustomFormat ist halt ein CustomFormat, also die Ziffern kommen dahin, wo du im CustomFormat die Platzhalter hingemacht hast.

    Es gibt aber auch Standard-Formate, die mögen sich da anders verhalten.
    Also immer bevorzugt Standard-Formate verwenden, und nur wenn keines geeignet ist, sich ein CustomFormat zurecht-basteln.
    @Dideldum Kannst Duj mal das komplette bereinigte Testprojekt hochladen?
    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!
    Laut stackoverflow geht das auf einem Nicht-AM/PM-System nicht, sofern ich das richtig verstehe.
    Wenn Du in der Systemsteuerung bei Region bei Format auf Englisch (Vereinigtes Königreich) stellst, kannst Du zwar beim DTP-Format auch AM/PM anzeigen lassen. Aber dafür das System umstellen?
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „VaporiZed“ ()

    Ja, ich kann das bestätigen, nachdem ich alle Knicks und Triffe von Programme mehrsprachig erstellen
    ausprobiert habe.
    Die Uhrzeit scheint unveränderbar.
    @Dideldum Mach Dir doch Deinen eigenen DateTimePicker:
    stackoverflow.com/questions/44…m-datetimepicker-in-c-net
    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!
    Danke Euch recht sakrisch für Eure Hilfe, @RodFromGermany und @VaporiZed. ^^

    So nen Mist...
    Zuerst kann der Picker keine fremdsprachige Wochentage ausgeben und dann nicht mal die Uhrzeit gemäss der Culture-Einstellung des Programms ausgeben.
    Da fummle ich den halben Tag und dann geht's gar nicht.
    Wenn mein Projekt gaaaaanz fertig ist, baue ich vielleicht einen eigenen DateTimePicker.
    Danke für den Link.
    Momentan quälen mich noch andere Sorgen mit Datum/Uhrzeit.

    Meine DataGridView mag mit

    VB.NET-Quellcode

    1. Private Sub Dgv_Einstellungen_Erinnerungen_SortCompare(sender As Object, e As DataGridViewSortCompareEventArgs) Handles dgv_Einstellungen_Erinnerungen.SortCompare
    2. If e.Column.Index = 0 Then
    3. Dim date1 As DateTime = DateTime.Parse(e.CellValue1.ToString())
    4. Dim date2 As DateTime = DateTime.Parse(e.CellValue2.ToString())
    5. e.SortResult = DateTime.Compare(date1, date2)
    6. If dgv_Einstellungen_Erinnerungen.SortOrder = SortOrder.Descending Then
    7. e.SortResult = -e.SortResult
    8. End If
    9. e.Handled = True
    10. Debug.Print(e.SortResult.ToString & " - " & date1.ToString & " - " & date2)
    11. End If
    12. End Sub
    13. Private Sub Dgv_Einstellungen_Erinnerungen_Sorted(sender As Object, e As EventArgs) Handles dgv_Einstellungen_Erinnerungen.Sorted
    14. dgv_Einstellungen_Erinnerungen.Refresh()
    15. End Sub


    Die Spalte 0 nicht nach den enthaltenen Datum-Strings sortieren.
    Beim ersten Klick auf den Spaltenkopf klappt es, aber weitere Klicks auf den Spaltenkopf ändern nur die Sort-Pfeilrichtung, das SortCompare wird auch durchlaufen, aber die Zeilen in der DGV bleiben, wie sie waren...
    Und ich stehe wieder mal auf dem Schlauch. :S

    Ich erhalte bei zwei Durchläufen folgende Debug-Ausgaben (bei drei vorhandenen Zeilen) mit "08.04.2024", "17.04.2024", "01.05.2024":

    VB.NET-Quellcode

    1. 1 - 08.04.2024 00:00:00 - 17.04.2024
    2. 1 - 08.04.2024 00:00:00 - 01.05.2024
    3. 1 - 17.04.2024 00:00:00 - 01.05.2024


    und

    VB.NET-Quellcode

    1. -1 - 08.04.2024 00:00:00 - 17.04.2024
    2. -1 - 08.04.2024 00:00:00 - 01.05.2024
    3. -1 - 17.04.2024 00:00:00 - 01.05.2024


    Warum castest du den CellValue erst zu String dann zu Date? Die Spalte enthält doch hoffentlich den Typ DateTime?

    Das DGV sortiert doch eigentlich selbstständig bei Klick auf den Spaltenkopf. Hast du's mal ohne die Events probiert?

    Ich denke mal dein SortResult = -SortResult musste weglassen, da das DGV außerdem sicher irgendwo die SortOrder Property anpasst von Descending zu Ascending, sonst könnte man ja nicht auslesen wie rum das DGV nu steht.
    Und da ergibt Plus und Plus dann Minus

    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „Haudruferzappeltnoch“ ()

    Danke Dir @Haudruferzappeltnoch (Ein Super-Nick :D )

    Das wollte ich auch - Spalte 1 und 2 als Date und Spalte 3 als String.
    Aber ich habe keine Möglichkeit gefunden, der Spalte den Typ Date zu verpassen.
    Ich finde nur String, Image, Button und Checkbox als verfügbare Types.

    EDIT:
    Habe es auch mit:

    VB.NET-Quellcode

    1. If dgv_Einstellungen_Erinnerungen.SortOrder = SortOrder.Descending Then
    2. e.SortResult = DateTime.Compare(date1, date2)
    3. Else
    4. e.SortResult = DateTime.Compare(date2, date1)
    5. End If

    versucht, aber keine Besserung.

    Mit der SortCompare überbrücke ich ja die interne Sort-Funktion - habe ich zumindest gelesen.
    Langsam. Eine DGVSpalte kann verschiedene Controls hosten. Was Du brauchst, bleibt DataGridViewTextBoxColumn. Dass der darin enthaltene Wert bei Dir ein Date ist, stört dann nicht. Aber für die Datenverarbeitung ist es schon sinnvoll, bei Date zu bleiben. Der CellValue ist nicht umsonst vom Typ Object. Wenn Du also ein Date reinpackst, kommst Du über den CellValue und DirectCast auch wieder zu nem Date.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Hi Ihr Zwei,

    @VaporiZed
    danke Dir für Deine Erklärung - jetzt ist es mir klarer verständlich.

    @Haudruferzappeltnoch,
    danke auch Dir - Du hast ganz recht - das doppelte Sort-Unterscheiden war das Problem.
    Ich dachte, dass das SortCompare mitgeteilt bekommen muss, in welche Richtung sortiert wird.
    Muss es aber gar nicht.
    Habe wieder mal viel zu kompliziert gedacht.
    Mit:

    VB.NET-Quellcode

    1. Private Sub Dgv_Einstellungen_Erinnerungen_SortCompare(sender As Object, e As DataGridViewSortCompareEventArgs) Handles dgv_Einstellungen_Erinnerungen.SortCompare
    2. If e.Column.Index = 0 Then
    3. Dim date1 As DateTime = DateTime.Parse(e.CellValue1.ToString())
    4. Dim date2 As DateTime = DateTime.Parse(e.CellValue2.ToString())
    5. e.SortResult = DateTime.Compare(date1, date2)
    6. e.Handled = True
    7. End If
    8. End Sub

    klappt es wunnebärchen, mit dem Sortieren - egal, ob die Zellen das deutsche oder englische Datumsformat beinhalten.

    Wenn ich in

    VB.NET-Quellcode

    1. Dim date1 As DateTime = DateTime.Parse(e.CellValue1.ToString())
    2. Dim date2 As DateTime = DateTime.Parse(e.CellValue2.ToString())

    den CellValue nicht zuerst in String umwandle mosert das Studio "BC30512: "Option Strict On" lässt keine implizite Konvertierung von "Object" in "String" zu.
    Wahrscheinlich, weil der aus keinem Object-Type parsen kann/will, ohne dessen Format zu kennen.
    Wie würdest Du die Befehle schreiben?
    Pfeil-Rücken-Brust-Auge.
    DateTime.Parse(e.CellValue1.ToString()) macht aus einem Object-Wert einen String, den Du dann zu einem Date-Wert parst. 8|
    Dabei genügt folgendes: CDate(e.CellValue1) macht aus einem Object-Wert einen Date-Wert.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.