Datetimepicker Datum setzen

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 15 Antworten in diesem Thema. Der letzte Beitrag () ist von ErfinderDesRades.

    Datetimepicker Datum setzen

    Hallo,

    kurz zu den Vorliegenden Formularen. Formular A (FormGrunddaten) hat unter anderen 2 gebundene Datetimepicker-Steuerelemente, Formular B auch (greifen aber auf eine andere Tabelle zu). Wenn ich im Formular B (FormKalkulation) einen neuen Datensatz anlege sollen die beiden Datetimepicker die Werte aus denen von Formular A holen.

    Quellcode

    1. Me.TblLvKalkulationBindingSource.AddNew()
    2. FormKalkulation.KalkulationVon.Value = FormGrunddaten.LaufzeitVon.Value
    3. FormKalkulation.KalkulationBis.Value = FormGrunddaten.LaufzeitBis.Value

    Das klappt auch prima, ich sehe das jeweilige Datum aus Formular A. Ich kann sogar mit diesem Datum weiter rechnen. Wenn ich allerdings den neuen Datensatz speichern will meint die BindingSource, dass die beiden Datumsfelder leer sind. Ich muss also erst das Datum verstellen damit die BindingSource die Auswahl erkennt. Gibt es hierfür einen Grund bzw. muss ich die DateTimePicker anders befüllen?

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

    Ich kann dir nicht sagen, wieso sich der DateTimePicker so verhält. Mach doch mal ein refresh der Controls mit .update() oder .refresh() vielleicht bemerkt die Bindingsource dann, dass sich etwas geändert hat.

    Manchmal verhalten sich Bindingsources eigenwillig, da hilft dann nur ein Workarround.
    Option strict = on

    If it's stupid and it works it ain't stupid.
    Ehm. Wie speicherst Du die neue Row? Denn das muss man eigentlich nicht. AddRow() gibt Dir doch die neue Zeile zurück bzw. wenn die BindingSource (BS) auf eine Datumsspalte zeigt, erhältst Du durch AddRow ein Objekt, welches auf die Datumsspalte der neuen Row zeigt =>

    VB.NET-Quellcode

    1. Dim NewDate = TblLvKalkulationBindingSource.AddNew()
    2. NewDate = FormGrunddaten.LaufzeitVon.Value

    Fertig. Damit in in der DataSource der BS eine neue Zeile hinterlegt, deren Datumswert eben FormGrunddaten.LaufzeitVon.Value ist.

    Wo taucht eigentlich die Zeile FormKalkulation.KalklulationVon.Value = FormGrunddaten.LaufzeitVon.Value auf? Form1 oder Form2? Wird Form2 durch Form1 aufgerufen oder umgekehrt oder weder noch?

    btw:
    FormKalkulation.KalklulationVon => FormKalkulation.KalkulationVon
    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.

    VaporiZed schrieb:

    VB.NET-Quellcode

    1. Dim NewDate = TblLvKalkulationBindingSource.AddNew()
    2. NewDate = FormGrunddaten.LaufzeitVon.Value
    Ich peile nicht ganz das Problem, aber dieser Code wird glaub nicht funktionieren.

    Generell ists sehr tricky, mit denselben Daten in mehreren Forms arbeiten zu wollen.
    Da kriegt man leicht durcheinander, was von wem wie gespeichert wird.
    @TE: Du sagst, das Speichern funktioniere nicht richtig - dazu kann nur gesagt werden, der Fehler liegt wahrscheinlich im Speicher-Code (hier nicht zu sehen).
    Evtl. speicherst du was anderes, als was du geändert hast.
    Evtl. wendest du auch Threading falsch an.
    Gibt viele Möglichkeiten.

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

    Stimmt. Nur der schnelle Test mit einer String-Spalte funktioniert so. Ansonsten ginge es (notfalls) so:

    VB.NET-Quellcode

    1. Dim NewRow = DataTable1BindingSource.AddNew()
    2. DirectCast(DirectCast(NewRow, Data.DataRowView).Row, DataSet1.DataTable1Row).Datum = FormGrunddaten.LaufzeitVon.Value

    Aber das ist erstmal wurscht, es sind noch zu viele Fragen offen.
    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.
    Also dann noch ein paar weitere Informationen. Im Formular A ist der Auftrag hinterlegt. In Formular B kann der Auftrag in mehrere Teil-Abschnitte unterteilt werden, je Teilabschnitt können andere Informationen dazu hinterlegt werden. Als Komfort wollte ich deswegen schon mal den Zeitraum des Auftrags angeben und den Inhalt der Datumsfelder übertragen. Diese sind in der Datenbank in beiden Tabellen Pflichtfelder, dürfen also nicht Null sein. Jede der Tabellen hat weitere Felder, das sollte für dieses Problem aber keine Rolle spielen.
    Die DateTimePicker sind in den Eigenschaften unter Databindungs -> Value an das jeweilige Tabellenfeld gebunden.
    Das speichern erfolgt mit folgendem Code (bereinigt):

    VB.NET-Quellcode

    1. If Me.TblLvKalkulationBindingSource.Current Is Nothing Then Exit Sub
    2. Me.TblLvKalkulationBindingSource.EndEdit()
    3. If Me.DbLeiKaDataSet.HasChanges Then
    4. Me.TblLvKalkulationTableAdapter.Update(Me.DbLeiKaDataSet.tblLvKalkulation)
    5. End If


    Der Code bleibt in der hier abgebildeten 2. Zeile hängen und bemängelt, das die Datumsfelder Null sind.
    Wie gesagt, wähle ich manuell ein Datum aus klappt es ohne Probleme.
    Der Code aus Post 1 steht in Formular B, den neuen Datensatz füge ich per Schaltfläche ein.

    Edit: Refresh/Update bei den DateTimePickern bringt leider auch nichts.

    Edit2: Ich schreibe die Werte jetzt erstmal direkt in die Datarow

    VB.NET-Quellcode

    1. Dim dr As DataRow = DirectCast(Me.TblLvKalkulationBindingSource.Current, DataRowView).Row
    2. dr(Me.DbLeiKaDataSet.tblLvKalkulation.KalkulationVonColumn.ColumnName) = FormGrunddaten.LaufzeitVon.Value
    3. dr(Me.DbLeiKaDataSet.tblLvKalkulation.KalkulationBisColumn.ColumnName) = FormGrunddaten.LaufzeitBis.Value

    Ist zwar der weniger einfache Weg, aber er funktioniert erstmal. Falls trotzdem jemand eine Lösung hat, immer her damit.

    Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von „AndPod“ ()

    probierma so:

    VB.NET-Quellcode

    1. Dim rw = DirectCast(DirectCast(Me.TblLvKalkulationBindingSource.Current, DataRowView).Row, DbLeiKaDataSet.tblLvKalkulationRow)
    2. rw.KalkulationVon = FormGrunddaten.LaufzeitVon.Value
    3. rw.KalkulationBis = FormGrunddaten.LaufzeitBis.Value
    wäre doch viel schnuckliger, oder?
    Und wenn du bei der Benamung noch bisserl mehr wert legst auf knappe, aussagekräftige Namen, könnte es auch so aussehen:

    VB.NET-Quellcode

    1. Dim rw = DirectCast(DirectCast(Me.bsKalkulation.Current, DataRowView).Row, KalkulationRow)
    2. rw.KalkulationVon = FormGrunddaten.LaufzeitVon.Value
    3. rw.KalkulationBis = FormGrunddaten.LaufzeitBis.Value
    Um alle Klarheiten nochmal zu beseitigen: In Form A (FormKalkulation) und Form B gibt es DateTimePicker. Form B soll aus Form A die Werte übernehmen und Form B soll auch neue Daten erzeugen können, richtig? Wie hast Du sichergestellt, dass Form A und Form B auf die selben Daten zugreifen? Dass die DTPs auf eine BindingSource verweisen ist klar. Aber worauf verweisen die BindingSources jeweils in Form A und B?
    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.
    @VaporiZed
    Also Form A (Grunddaten) greift auf die Tabelle Grunddaten zu und enthält unter anderem 2 an die Tabelle Grunddaten gebundene DateTimePicker.
    Form B (Kalkulation) greift auf die Tabelle Kalkulation zu und enthält ebenfalls 2 DateTimePicker, welche an die Tabelle Kalkulation gebunden sind. Und die DateTimePicker in Form B sollen die Werte der DateTimePicker aus Form A übernehmen, sobald man in Form B einen neuen Datensatz anlegt.
    Wenn ich die Werte wie im ersten Post zuweise, stehen sie zwar im DateTimePicker, werden aber nicht in die Datarow übernommen. Weise ich die Werte direkt der Datarow zu, stehen sie nicht im DateTimePicker. Wähle ich allerdings ein Datum im DateTimePicker (Form B) aus, habe ich das Datum auch in der Datarow. Dadurch weiß ich, das die auf jeden Fall miteinander verbunden sind.
    Nochemal: Was ist die Datenquelle für die BindingSources? Ein DataSet? Eine SQL-DB? »Tabelle« ist leider keine ausreichend aussagekräftige Info.
    Ich hab versucht, das mal nachzubauen. Verwendet man ein DataSet, bietet der Designer einem eh an, dass man den korrekt gebundenen DateTimePicker auf das Form ziehen kann. Bei formübergreifenden CE-Zugriffen auf das DataSet muss man nur sicherstellen, dass alle Forms auf das selbe (nicht das gleiche!) DataSet zugreifen.
    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.
    Für Databinding ist eine Datenquelle nie eine Datenbank - an eine Datenbank kann man nicht binden.
    Besser wäre der Begriff "Datensenke" oder "Persistenz" - weil man kann ja auch in Dateien persistieren.

    Jdfs. Datenquelle ist immer ein .Net-Objekt-System, welches das (abstrakte) Datenmodell abbildet.
    Auch die Persistenz bildet das Datenmodell ab, aber in einer nicht direkt verwendbaren Form.
    (Und wenn du Daten vom Bildschirm auffn Zettel schreibst, und später wieder eintippst, dann ist der Zettel die Persistenz, und bildet auch das Datenmodell.)

    Etwas flapsig bezeichne ich auch das genannte .Net-Objekt-System als "Datenmodell", genauer wäre "konkretes Datenmodell".
    Günstig ist ein typDataset als Objekt-System (ein typDataset enthält ja viele Klassen, und wenn befüllt massenhaft Objekte) alias Datenmodell, insbesondere, weil es sich hervorragend als Datenquelle für Databinding eignet.
    Aaber man kann seine Datenmodell auch anders generieren, oder auch selber basteln.

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