Announcement

Collapse
No announcement yet.

Exception behandeln mit typisiertem Dataset

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

  • Exception behandeln mit typisiertem Dataset

    Hallo,

    dies ist mein erster Beitrag hier. Wie so oft ist der erste Beitrag gleich eine Frage.
    Ich hoffe in Zukunft aber auch mit Antworten für andere Fragen beisteuern zu können.

    Meine Frage:

    Ich habe ein typisiertes Dataset mit einer Tabelle.
    In der Tabelle gibt es ein Feld Name welches mit einem unique Key versehen ist.
    In der Datacolumn definition dieses Feldes ist die Eigenschaft Unique = True.

    In einem Formular wird dieses Feld an eine Textbox gebunden.

    Ich möchte nun die Exception behandeln, die geworfen wird, wenn der Benutzer in diese Textbox einen "nicht eindeutigen" Wert eingiebt und den Datensatz wechselt.

    An welcher Stelle muss ich die Exception behandeln?

    Danke für Eure Hilfe

    Grüße

    Roland

  • #2
    Wenn Du eine BindingSource dazwischen hast würde ich sagen im DataError EventHandler. Dort sollte die prinzipiell aufschlagen.

    Comment


    • #3
      Danke fanderlf,

      das war auch mein erster Gedanke, leider wird dieser Event-Handler bei dieser Exception nicht ausgelöst.


      [highlight=vbnet]
      Private Sub bsBetriebsmodelle_DataError(ByVal sender As Object, ByVal e As System.Windows.Forms.BindingManagerDataErrorEventA rgs) Handles bsBetriebsmodelle.DataError

      MsgBox("Dieser Eventhandler wird leider bei dem Constraint nicht ausgelöst")

      End Sub
      [/highlight]

      Vielleicht habe ich mir ja auch ein anderes Problem eingefangen.
      Ich werde mal schnell ein neues Projekt erstellen, in dem ich nur die nötigen Dinge aufnehme und noch einmal testen.

      Grüße Roland
      Zuletzt editiert von RolandF; 22.10.2010, 08:21. Reason: Codeformatierung an VB.net angepasst

      Comment


      • #4
        leider Fehlanzeige,

        gerade habe ich ein neues Minimalprojekt zusammengeklickt und den Eventhandler der Bindingsource implementiert.

        [highlight=c#]
        private void OPERATINGCLASSESBindingSource_DataError(object sender, BindingManagerDataErrorEventArgs e)
        {
        MessageBox.Show("Hier soll der Fehler aufschlagen");
        }
        [/highlight]

        Der Handler wird nicht ausgeführt

        Die Exception wird dann an folgender Stelle geworfen:

        [highlight=c#]
        static void Main()
        {
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(fals e);
        Application.Run(new Form1()); // <== hier wird die Exception geworfen.
        }

        [/highlight]

        Falls noch jemand eine Idee hat, währe ich dafür dankbar.

        Grüße

        Roland
        Zuletzt editiert von RolandF; 22.10.2010, 08:26. Reason: Codeformatierung angepasst

        Comment


        • #5
          das gleich Problem habe ich auch, wenn in der gebundenen Textbox z.B. die Eigenschaft "MaxLength" des Datacolumn Objekts nicht eingehalten wird!

          Ist es jetzt so, dass typisierte Datasets in Verbindung mit gebundenen Textfeldern normalerweise nicht verwendet werden?

          Oder hat es schon mal jemand geschaft in dieser Konstellation ein vernünftiges Exception-Handling hinzubekommen?

          Ich möchte vermeiden für jeden möglichen Constraint in Kombination mit jedem Control des Formulars eine eigene Plausibilitätsprüfung vorzunehmen.

          Grüße

          Roland

          Comment


          • #6
            Wie immer gibt es viele Wege um das zu lösen.

            Wenn du nur beim Wechseln der Datensätze prüfen willst würde ich explizit an dieser Stelle im Code die den Wechsel auslöst ein EndEdit auf die aktuelle Datarow ausführen. Um diesen Aufruf kannst du dann dein Exceptionhandling basteln.

            Comment


            • #7
              Vielleicht kann man auch das EnforceConstraints auf false setzen und dann mit HasErrors prüfen ob etwas nicht stimmt? Dann könnte man die Fehlerbehandlung z.B. erst beim Speichern machen. Oder zu jedem anderen beliebigen Zeitpunkt.

              Aber das wäre jetzt bei mir auch nur ein Versuch k.a. ob das klappt.

              Ist das DataSet bei euch der maßgebliche Speicher? Ansonsten würde ich die Constraints dort deaktivieren und nur beim Commit in die DB die Exceptions der DB abfangen. So hab ich das in meinem Programm gelöst. Zumal die DataSets bei mir manchmal sehr störrisch waren.

              Comment


              • #8
                Hallo Ralf,

                die Idee mit dem EndEdit habe ich mal aufgegriffen.
                Leider fehlt mir immer noch ein Ereignis welches aufgerufen wird bevor die Exception geworfen wird.
                bs_PositionChanged ist z.B. schon zu spät.

                Hallo fanderlf,
                deinen Vorschlag verwende ich zur Zeit schon als Workaround, jedoch ist es für den Anwender unschön, wenn er erst beim Speichern die Fehlermeldung erhält.
                Ich werde es jetzt mal so machen, dass ich bei jedem Datensatzwechsel den Datensatz speichere und dabei die Exception behandele.
                Damit können wir erst einmal leben.

                Danke noch einmal für alle die geholfen haben!

                Roland

                Comment


                • #9
                  Leider fehlt mir immer noch ein Ereignis welches aufgerufen wird bevor die Exception geworfen wird.
                  Dann hast du meinen Vorschlag Missverstanden. Du sollst nicht EndEdit aufrufen wenn die Position geändert wurde. Das ist zu spät sondern vorher.

                  Irgendwo im Code wirst du einen Wechsel des Datensatzes auslösen. Z.b durch BindingSource.MoveNext(). Du sollst selbst vorher EndEdit() aufrufen damit ein prüfen der Constraints erfolgt. Um den Aufruf von EndEdit kannst du dann ein ExceptionHandling aufsetzen und dann steuren ob noch ein Datensatz Wechsel erfolgen soll/kann.

                  Comment


                  • #10
                    Ich habe Deinen Vorschlag schon verstanden.
                    Dann müsste ich aber gewährleisten, dass der Anwender immer genau einen Button betätigen muß, ansonsten könnte der Anwender z.B. per Tastatur den Datensatz wechseln, das Formular schließen etc. das müsste alles überwacht werden.

                    Comment

                    Working...
                    X