TabStops

  • VB.NET

Es gibt 27 Antworten in diesem Thema. Der letzte Beitrag () ist von JLH.

    Hallo Zusammen,

    ich habe ein Problem mit Tabstops...

    Auf einer Form sind mehrere Groupboxen in denen irgendwelche Daten eingegeben und mit diesen Berechnungen durchgeführt werden. In den Groupboxen sind dazu natürlich Textboxen die ein nach dem anderen über die Tabstops angesprungen werden. Damit der User nur die Teile berechnen lassen kann die auf vorhergehende Berechnungen basieren sind die folgenden Groupboxen disabled und werden erst nach erforderlicher Berechnung enabled.

    Jetzt mein Problem: Ich laß die Berechnung entweder mit einem textbox.leave oder groupbox.leave durchführen. Wurde alles richtig eingegeben und korrekt berechnet enable ich die nächste Groupbox. Da die nächste Textbox zum Zeitpunkt des Events ja noch gesperrt war springt aber der TAB wieder an den Anfang und man muß alles nochmal durchtabben oder mit der Maus die gewünschte TextBox anwählen was natürlich umständlich ist. Mit textbox.focus() springt tatsächlich der Cursor in die gewünschte Box ABER die ganze Berechnung wird vorher nochmal durchlaufen weil der Event leave ja wieder zündet was zum einem unschön ist und zum anderen nervig ist wenn die selbe Messagbox 2 mal aufgeht.

    Ich hoffe ich habe das verständlich rübergebracht... Weiß jemand eine Lösung?

    Grüße

    JLH schrieb:

    Da die nächste Textbox zum Zeitpunkt des Events ja noch gesperrt war
    Diesen Zustand musst Du abfangen und entsprechend reagieren.
    ====
    Das groupbox.leave dürfte hier der Kern des Übels sein, Du musst da die einzelnen Controls überprüfen.
    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!

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

    Wenn die Berechnung durchgeführt wurde, setz ein Flag (Boolean-Variable). Wenn die erste TextBox der GroupBox markiert wird und das Berechnen-Flag gesetzt wurde, gehe zur nächsten GroupBox.
    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:

    Wenn die Berechnung durchgeführt wurde, setz ein Flag (Boolean-Variable). Wenn die erste TextBox der GroupBox markiert wird und das Berechnen-Flag gesetzt wurde, gehe zur nächsten GroupBox.


    Ja... genau so hab ich mir das vorgestellt. Ich dachte gestern allerdings es könnte mehrere Zweige geben die ich da mit Flags versehen müßte. Ist aber nur einer.



    ErfinderDesRades schrieb:

    die Standard-Vorgehensweise für sowas ist bischen anders. Da werden nicht Groupboxen disabled, sondern im _Validating-Event kann man durch setzen von e.Cancel=True verhindern, dass zB eine invalide Groupbox verlassen werden kann.


    Ich verstehe nicht so recht was Du da meinst... Alle Groupboxen, bis auf der ersten, sind in meiner Anwendung disabled. Bei meiner Anwendung geht um Verzahnungen. Es ist zB nicht möglich ein Prüfmaß zu berechnen ohne vorher die Verzahnung zu definieren. Ich finde es hat einen professionelleren Touch wenn die Bereiche erstmal ausgegraut sind. Also habe ich die Groups für verschiedenen Größen disabled und enable sie sobald die Verzahnung definiert ist. Ich möchte also in eine zuvor ungültige Box die jetzt gültig wurde springen, die aber durch den Event Leave erst gültig gemacht worden war aber in dem Moment noch nicht gültig ist ?( ?( ?(
    Aber den Event Validating wollte ich schon immer mal unter die Lupe nehmen. Eigentlich hatte ich auf so eine Art Lösung gehofft.
    Vollzitat des direkten Vorposts an dieser Stelle entfernt ~VaporiZed

    Es gibt da einige Abhängigkeiten die erst erfüllt bzw. berechnet sein müssen bevor man etwas anderes berechnen kann. Also Ja... erst alle < X dann X.

    Ich gebe zu, ich habe mich bis jetzt mit dem Validating/Validated noch nicht beschäftigt. So wie es sich anhört ist es aber genau das was ich brauche :)

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

    JLH schrieb:

    Ich verstehe nicht so recht was Du da meinst... Alle Groupboxen, bis auf der ersten, sind in meiner Anwendung disabled.
    Naja - das mit dem disablen ist halt problematisch.
    Man kann einem disableten Control nicht den Focus geben - folglich kann das mit dem Durch-Tabben nicht funktionieren.
    Mit iwelchen Spezial-Operationen, versteckten Controls und sowas kann mans vlt. hinwursteln.
    Aber wenn du mit dem Validating dich anfreunden kannst, wirds viel einfacher.
    Naja... wenn man es sich genau überlegt hast Du natürlich recht. Aber es könnte ja auch so sein wie ich es mir vorgestellt habe. Die Frage ist wann beginnt was? Ich verlasse die Groupbox und triggere damit den Event Leave. In dieser Sub setze ich die nächste Groupbox auf enabled und setze gleich danach den Focus auf eine Textbox in der jetzt sichbaren Groupbox.

    Je mehr ich darüber nachdenke, desto mehr bin ich überzeugt, daß es eigentlich gehen sollte... :/

    Das mit dem Validating ist aber genau richtig. Es hat mir noch einpaar mehr Ideen gegeben wie ich meine User durch den Input leiten kann.

    JLH schrieb:

    Je mehr ich darüber nachdenke, desto mehr bin ich überzeugt, daß es eigentlich gehen sollte.
    Da denkst du glaub falsch.
    Du kannst die Groupbox ja nur verlassen, indem du ein Control ausserhalb betrittst.
    Und das geht nicht, weil das control, was du eiglich betreten willst, ist disabled - es kann also nicht betreten werden.
    Möglicherweise sind sogar alle anneren Controls in Groupboxen, die disabled sind - dann kannste deine Groupbox überhaupt nicht verlassen.
    Da ist die Frage, ob das zutreffen soll

    JLH schrieb:

    Ich verlasse die Groupbox und triggere damit den Event Leave.
    oder eher, dass eine bestimmte TextBox verlassen werden soll und dann was passiert.
    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.

    ErfinderDesRades schrieb:

    Zitat von JLH: „Je mehr ich darüber nachdenke, desto mehr bin ich überzeugt, daß es eigentlich gehen sollte.“Da denkst du glaub falsch.
    Du kannst die Groupbox ja nur verlassen, indem du ein Control ausserhalb betrittst.
    Und das geht nicht, weil…

    Ich bin da schon einverstanden... Das hatte ich ja umgangen, indem ich eine nutzlose Control in meiner Form hatte die enabled war. Sinngemäß dachte ich an "Ich fahre mit dem Auto los und mache vorher die Garage auf. Während ich die Garage verlasse bestimme ich aber wohin ich fahre." Das meinte ich müsse doch gehen.

    VaporiZed schrieb:

    Da ist die Frage, ob das zutreffen sollZitat von JLH: „Ich verlasse die Groupbox und triggere damit den Event Leave.“oder eher, dass eine bestimmte TextBox verlassen werden soll und dann was passiert.


    Genau das war dann mein Gedanke... Ich lasse den User alles in meiner Vorgegeben Reihenfolge ausfüllen und wenn er am letzten angekommen ist rechne ich und lasse ihn raus. Die Sache hat jetzt aber wieder einen Haken:


    Das Validating/Validated ist sehr gut und deckt auch meine Eingaben wunderbar ab. Aber leider kann ein User "richtige" Eingaben tätigen die aber in der Kombination eine "Sinnlose" Berechnung ergeben.
    Usere Firma stellt Werkzeuge zur Fertigung von Verzahnungen her. Eine (gerade) Verzahnung besteht aus der Zähnezahl, dem Modul und dem Eingriffswinkel. Wie dick ein Zahn ist hängt jetzt von einem Abmaß ab und davon gibt es ein paar. Ich nehme mal das Rollen- oder Kugelmaß als Beispiel. Das besteht aus zwei Zahlen, einmal dem Absatnd der Rollen und dem Durchmesser der Rollen/Kugeln. Ich prüfe mit dem Validating ob die Zahlen in einem korrekten Bereich liegen (>0, <X, usw.). Und jetzt mein Problem:
    Ich frage die letzte Eingabe mit Validating ab und wenn die Eingabe plausible ist berechne ich ob die Verzahnung überhaupt geht. Jetzt kommt vielleicht raus, daß das Rollenmaß oder Rolle ist zu groß oder zu klein gewählt wurde. Es muß aber nicht zu groß/klein sein weil die letzte Eingabe (Kugeldurchmesser) falsch war sondern der User sich irgendwo vorher schon vertippt hat. Jetzt hänge ich aber in dieser TextBox und kann garnicht an die zu korrigierende Stelle springen weil mich der Validate nicht aus der TextBox raus lässt. Ich würde daher gerne erst alle Eingaben (TextBoxen) validieren und erst wenn alle Eingaben validiert sind die Groupbox als ganzes validieren. Wenn die berechnung ok war geht's weiter, wenn nicht muß der User nachbessern aber auch dazu in eine beliebige Zelle springen können. Geht sowas mit Validate? Oder gibt's wieder was besseres?

    Danke!

    JLH schrieb:

    Ich frage die letzte Eingabe mit Validating ab
    hm - Das Feature ist noch viel mächtiger.
    Man kann ContainerControls validieren. Dabei kann man innerhalb des Containers (Panel, SplitContainer, Groupbox, TableLayoutPanel,...) alle Controls unüberprüft besuchen und bearbeiten - Die Validierung schlägt erst zu, wenn der Container verlassen wird.
    Und die Container sind auch noch schachtelbar.
    Ein weiteres ist, bei bestimmten Controls .CausesValidation=False zu setzen. Diese Controls kann man dann auch besuchen, bevor die Eingabe abgeschlossen ist (sinnvoll zB für Hilfe-Button etc.).
    Guggemol hier: activevb.de/tipps/vbnettipps/tipp0083.html
    Also sagen wir mal du hast zwei Textboxen in einer GroupBox.
    Dein Problem hört sich so an, als ob du bei Textbox2 im Validating-Event deine Berechnung prüfst, die aber im Zweifel auch von Textbox1 abhängt.
    Aber Textbox2 soll/darf ja nicht Textbox1 validieren. Das Validating muss so kleinschrittig sein wie das Element, dem es angehört.

    Also Textbox1 prüft nur ob ne Zahl bei ihm drin steht, Textbox2 ebenso, und die GroupBox prüft dann erst deine Berechnung. (Wenn man denn die Textboxen überhaupt prüfen möchte in diesem Fall.)

    ErfinderDesRades schrieb:

    - Die Validierung schlägt erst zu, wenn der Container verlassen wird.


    Ist das nicht genau wo es bei mir klemmt? Ich möchte eine Groupbox verlassen was ich aber nicht kann, da noch kein weiteres Control aktiv ist. Bis jetzt schaffe ich es nur die Groupbox zu validaten indem ich das Fenster mit "X" rechts oben schließe. Das blöde daran ist, daß ich dann nichts mehr sehe ;(
    Danke für den Link, ich schau da mal rein :)

    @Haudruferzappeltnoch Naja.... die Groupbox1 ist die Basis sämtlicher Berechnungen die mein Programm erledigen soll. Bisher (VB6) hatte ich alle Felder ausfüllen lassen und einen Butten "Nächste Seite". Hat man diesen geklickt wurde alles auf plausibilität geprüft. Waren falsche Zahlen drin wurde diese Seite (Form) nicht verlassen und mit einer MsgBox auf den Fehler hingewiesen. Waren die Zahlen OK, wurde berechnet. Wenn es dann einen Fehler gab wurde dem User gesagt welche Eingabe zu groß oder zu klein war und auch da die Seite nicht verlassen. Erst wenn diese Rechnung ok war, war ein Verlassen der Seite zur nächsten Berechnung auf einer neuen Seite möglich. Heute habe ich alles in eine einzige übersichtlich Seite, deshalb die Groupboxen. Ich kann aber keine der folgenden Boxen berechnen wenn nicht diese ausgefüllt wurde. Deshalb schalte ich die alle aus und erst wenn alles ok ist die nächste an. Und die eigentlich Frage ist wie trigger ich das... Ich habe die letzte Textbox verwendet um erst zu prüfen ob die Eingabe palusible ist und wenn ja, dann soll auch gleich gerechnet und der Rest geprüft werden. Da ich dazu aber "validating" verwende komm ich bei egal welchem Fehler aus der Textbox nicht raus.

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

    Doch.. Du hast mich davon abgebracht.
    Ich kann aber genauso wenig etwas berechnen wenn vorherige Eingaben fehlen wie ein deaktivierts Control anspringen. Damit der User nicht auf die Idee kommt es trotzdem zu versuchen mache ich Teile des Formulars aus. Ich suche nach wie vor eine Möglichkeit die nächsten Controls erst zu aktivieren wenn alle Eingaben korrekt sind und will sie dann anspringen (können). Ich habe auch schon eine Idee die heute ausprobieren möchte.
    Hat funktioniert und es war so naheliegend...
    Mit _Validating habe ich die Plausibilität der Eingaben erschlagen. In _Validated habe ich den clear Error und alles drin zur Berechnung. Wenn alle Abfragen bestanden sind lasse ich rechnen und gebe die Ergebnisse aus. Dann schalte ich die nächste Groupbox an, setze den Focus auf die nächste TextBox und verlasse die Sub :)

    Einziger Schönheitsfehler den ich jetzt allerdings habe ist, möchte man jetzt trotz erfolgreicher Rechnung doch zurück und was ändern tabbed man ja mit shift+tab rückwärts. Zwangsläufig in die vorherige TextBox mit dem _Validated Event. Und logischerweise schickt der einen wieder in die TextBox von der man kam... Auch gelöst :)

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