Announcement

Collapse
No announcement yet.

DateTimePicker Probleme mit typisiertem DataSet

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • DateTimePicker Probleme mit typisiertem DataSet

    VS2005 C#, SQLEXPRESS Tabelle mit DateTime Wert NOT NULL

    Wenn ich einen neuen Datensatz mit dem +Button von BindingNavigator anlege
    schlägt der DateTimePicker mir das aktuelle Datum vor. Wenn ich dieses dann
    direkt abspeichern möchte mit dem Spechern Button bekomme ich immer
    ein leeres Datumsfeld bzw. kein Speichern des Datensatzes.

    Verändere ich dagegen den DateTimePicker Wert manuell mit der Maus auf
    z.B. den folgenden Tag und speichere, dann klappt alles.

    Wie kann man das lösen das er den vorgeschlagenen Wert übernimmt?
    Vielen Dank.

  • #2
    Wie hängen denn der DateTimePicker.Value und der DataTable-Wert zusammen? Wie wird das Speichern ausgelöst und verwirklicht? Hängt eine BindingSource dazwischen? Hat der DateTimePicker beim Speichern des null-Wertes den Focus?

    Wenn die beiden letzten Fragen bejaht werden, genügt es vielleicht, zunächst bindingSource.EndEdit() aufzurufen: Die aktuellen Werte werden standardmäßig nämlich erst dann übernommen, wenn in die nächste Zeile gewechselt wird; dieser Schritt fehlt beim Speichern oft.

    Jürgen

    Comment


    • #3
      Leider führt das Ausführen von BindingSource.EndEdit()
      zum sofortigen Abbruch (Error).

      dateTimePicker1 ist über BindingSource angebunden.


      private void bindingNavigatorAddNewItem_Click(object sender, EventArgs e)
      {
      tBBindingSource.EndEdit();
      dateTimePicker1.Value = DateTime.Now.AddDays(1).Date;
      }

      Nur wenn der Wert manuell von dateTimePicker1 verändert wird, funktioniert
      das abspeichern korrekt.

      Beim Klicken auf den + Button werden wahrscheinlich alle Werte auf Null
      gesetzt, dateTimePicker1 zeigt zwar den Wert optisch an, er wird aber nicht
      in die Datenbank geschrieben wenn kein Value_Changed Ereignis bei ihm
      eintritt.

      Wie kann man das lösen ?.
      Vielen Dank.

      Comment


      • #4
        Habe den Fehlerpunkt eingegrenzt.
        Bei ausführen von this.tBBindingSource.EndEdit() erfolgt die Exception.
        Es ist also vermutlich so, dass der datetimepicker Wert nicht in die
        DataTable bzw. über bindingsource angebunden ist. Es steht also ein
        NULL Wert drin und das führt zur Exception.

        Wie kann man das korrekt ausführen ?.
        Vielen Dank.

        private void tBBindingNavigatorSaveItem_Click(object sender, EventArgs e)
        {
        this.Validate();
        try
        {
        //MessageBox.Show("vor");
        this.tBBindingSource.EndEdit();
        //MessageBox.Show("endedit");
        //dateTimePicker1.Checked = false;



        this.tBTableAdapter.Update(this.kinoDataSet1.TB);
        //MessageBox.Show("Update "+dateTimePicker1.Value.ToShortDateString());



        }
        catch
        {
        MessageBox.Show("Nicht gespeichert");
        }
        }

        Comment


        • #5
          Originally posted by BB View Post
          Bei ausführen von this.tBBindingSource.EndEdit() erfolgt die Exception.
          Warum müssen wir bloß immer raten, um welche Exception es sich handelt und welche weiteren Informationen durch ex.Message oder ex.ToString() geliefert werden.

          Was gilt denn nun?
          Originally posted by BB
          dateTimePicker1 ist über BindingSource angebunden.
          Originally posted by BB
          Es ist also vermutlich so, dass der datetimepicker Wert nicht in die DataTable bzw. über bindingsource angebunden ist. Es steht also ein NULL Wert drin und das führt zur Exception.

          Wie kann man das korrekt ausführen ?.
          Wie bei jedem anderen Control auch, etwa so:
          Code:
          dateTimePicker1.DataBindings.Add("Value", tBBindingSource, "Datumsfeld");
          Jürgen

          PS 1. Ich habe immer noch nicht verstanden, was diese Fragen mit einem typisierten DataSet zu tun haben.
          PS 2. Bitte markiere Code-Abschnitte mit dem '#'-Button; das liest sich besser (und kann durch "Editieren" auch nachträglich geändert werden).

          Comment


          • #6
            Habe nun die Fehlermeldung:

            Column 'VOM' does not allow nulls.


            Das Hinzufügen des Codes
            dateTimePicker1.DataBindings.Add("Value", tBBindingSource, "VOM");
            hat nicht geklappt, die Fehlermeldung hier:

            This causes two bindings in the collection to bind to the same property.
            Parameter name:binding


            Wie kann ich in Column 'VOM' den Wert aus datetimepicker1 reinschreiben bzw.
            übernehmen lassen so dass es funktioniert ?

            Vielen Dank.

            Comment


            • #7
              Originally posted by BB View Post
              Das Hinzufügen des Codes
              dateTimePicker1.DataBindings.Add("Value", tBBindingSource, "VOM");
              hat nicht geklappt, die Fehlermeldung hier:

              This causes two bindings in the collection to bind to the same property.
              Parameter name:binding
              Das bedeutet doch aber, dass der DateTimePicker schon eine Datenbindung bekommen hat. Welche und durch welchen Code???????? Schon in meinem vorigen Beitrag hatte ich doch auf den Widerspruch in Deinen beiden Zitaten "angebunden" und "nicht angebunden" hingewiesen!

              Die andere Exception kann damit zusammenhängen, dass eine falsche/ungewünschte Verknüpfung vorhanden ist. Aber darüber kann ich erst etwas vermuten, wenn das DataBinding geklärt ist.

              Jürgen

              Comment


              • #8
                Ja, der datetimepicker1 hat ein DataBinding. Er hat es durch das Ziehen
                des Feldes "VOM" vom Dataset automatisch bekommen und den Code
                selbst generiert.

                Beim Neuanlegen bzw. Speichern schreibt er aber anscheinend nicht automatisch
                den Wert von DateTimepicker1 in das mit ihm verbundene Feld "VOM".

                Der Datetimepicker1 tut das nur dann, wenn das Datum verändert wird vom
                vorgeschlagenen Datum. Dann funktioniert das auch und es gibt keine Exception
                (Column 'VOM' does not allow nulls).

                Ist hier ein Fehler im DateTimePicker ?.

                Brauche eine Lösung hierfür.

                Vielen Dank.

                Comment


                • #9
                  Bug im DateTimePicker bei DataBinding

                  Beim Googlen ist tatsächlich ein Bug im DateTimepicker beim Binding
                  mehrfach angesprochen. Leider habe ich keine Lösung hierfür gefunden.
                  Das was Microsoft vorschlägt ist leider in VB.NET geschrieben

                  http://support.microsoft.com/kb/313513

                  Wer weiss da was und kann helfen
                  Vielen Dank.

                  Comment


                  • #10
                    Hallo,

                    das grundsätzliche Problem mit dem Value Type des DateTimePickers besteht von Anfang an (.NET 1.0). Wenn die Datenbank-Tabelle die Datumsspale als NOT NULL kennzeichnet, muss jeder neue Datensatz der DataTable-Instanz sofort mit einem Datumswert vorbelegt werden. In diesem Fall kann das vorbelegte Datum auch dann erfolgreich in der Datenbank gespeichert werden, kann das DateTimePicker-Control nicht angefasst wird:

                    [highlight=C#]
                    private void bindingNavigatorAddNewItem_Click(object sender, EventArgs e)
                    {
                    DataRowView aDRV = (DataRowView)this.dTPDemoBindingSource.Current;
                    tempdbDataSet.DTPDemoRow aNewRow = (tempdbDataSet.DTPDemoRow)aDRV.Row;
                    aNewRow.Testeintrag = "(bitte ausfüllen)";
                    aNewRow.TestDatum = DateTime.Today;
                    this.dTPDemoBindingSource.ResetCurrentItem();
                    }
                    [/highlight]

                    Comment


                    • #11
                      Vielen Dank für die Antwort.
                      Leider habe ich Zeile 4 nicht verstanden. Was ist mit

                      tempdbDataset.DTPDemoRow gemeint ?. Muss ich tempdbDataset erst neu
                      anlegen oder ergibt sich das aus meinem vorhanden Dataset ?.
                      Können Sie mir dies bitte noch einmal genau erklären .

                      Vielen Dank.

                      tempdbDataSet.DTPDemoRow aNewRow = tempdbDataSet.DTPDemoRow)aDRV.Row;

                      aNewRow.Testeintrag = "(bitte ausfüllen)";

                      aNewRow.TestDatum = DateTime.Today;

                      Comment


                      • #12
                        Andreas Kosch hat eigenen Code kopiert und benutzt meistens typisierte DataSets. Mit allgemeinen Klassen und Deinen Bezeichnungen geht es so:
                        Code:
                        private void bindingNavigatorAddNewItem_Click(object sender, EventArgs e)
                        {
                            DataRowView aDRV = (DataRowView)tBBindingSource.Current;
                            DataRow aNewRow = aDRV.Row;
                            //  jetzt musst Du natürlich Deine Feldnamen verwenden:
                            aNewRow["Testeintrag"] = "(bitte ausfüllen)";  
                            aNewRow["TestDatum"] = DateTime.Today;
                            tBBindingSource.ResetCurrentItem();
                        }
                        Jürgen

                        Comment


                        • #13
                          Funktioniert jetzt einwandfrei.

                          Der Code funktioniert auch ohne DataRow aNewRow=aDrv.Row.


                          Vielen Dank.

                          Comment

                          Working...
                          X