VB.net Problem mit CellEndEdit in Datagridview

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

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

    VB.net Problem mit CellEndEdit in Datagridview

    Hi Ihr,

    ich komme vom VB6 und arbeite mich erst seit ein paar Monaten langsam (so wie es die Freizeit halt zulässt) ins VB.net ein.

    Habe ein Problem mit einer Datagridview.

    Wenn ich im Bearbeiten einer Zelle bin, also das Caret in einer Zelle steht und ich deren Text ändern kann, wird der Handler CellEndEdit korrekt aufgerufen, sobald ich ein anderes Control wie z.B. einen auf der Form befindenden Treeview oder eine Textbox anklicke.

    Aber klicke ich während des Bearbeitens einer Zelle im DGV auf einen Menubutton in der Menuleiste oder auf einen Button in der Symbolleiste wird der CellEndEdit-Handler nicht aufgerufen.
    Kein dgv1_Leave, kein dgv1_CellLeave, kein dgv1_Cellvalidating wird dann ausgeführt.

    Kennt jemand dieses Problem und weiss, wie ich dieses Problem elegant umschiffen kann?

    Wenn ich in einen Button-Handler der Symbolleisten-Buttons testhalber in dessen erste Zeile "trv1.setfocus()" oder "txb1_setfocus()" reinschreibe, wird der "dgv1_cellendedit"-Handler korrekt aufgerufen, sobald ich diesen einen Button anklicke.
    Aber ich will nicht unbedingt alle 50 Menubutton-Handler und ebensoviele Symbolleisten-Button-Handler so umschreiben, dass alle Handler manuell den Focus auf ein Control legen, das diesen gar nicht braucht, nur damit das dgv1_cellendedit ausgeführt wird.

    Gibt es hierfür keine vernünftige Lösung, dass der dgv1_cellendedit automatisch auch beim Anklicken eines Menupunkts oder eines Symbolleisten-Buttons ausgeführt wird?

    Habe schon nach allem möglichen im Web gesucht - aber nicht mal ChatGPT versteht mein Problem.
    Oder ich kann das nicht so beschreiben, dass die Maschine es versteht... :D

    Wäre toll, wenn mir dabei einer von Euch helfen könnte.

    Beste Grüsse
    @Dideldum Willkommen im Forum. :thumbup:
    Mit welchem Betriebssystem, mit welchem Studio und mit welcher NET bzw. Framework-Version arbeitest Du?
    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!
    Hi Rod,

    danke für's Wilkommen.

    Ich habe Win10Pro und habe
    mit VS2019 angefangen und seit heute nach einem SSD-Ausfall und
    erforderlicher Neuinstallation des Win10 VS2022 in Benutzung. Beide mit
    Pro-Lizenz.

    Das Net-Framwork ist 4.7.1

    Der Aufbau meines Programms ist:
    Toolstripcontainer1 Main
    Im Toolstripcontainer1 Top-Panel die Menuleiste1 und Symbolleiste1
    Im Toolstripcontainer1 Center-Panel ein Splitcontainer1
    Im Toolstripcontainer1 Bottom-Panel eine Statusleiste1

    Im Splitcontainer1 linkes Panel ein Treeview
    Im Splitcontainer1 rechtes Panel ein weiterer Split-Container2

    Im Splitcontainer2 linkes Panel das DatagridView1
    Im Splitcontainer2 rechtes Panel ein weiterer Toolstripcontainer2

    Im Toolstripcontainer2 Top-Panel eine Menuleiste2 und Symbolleiste2
    Im Toolstripcontainer2 Center-Panel eine Textbox1
    Im Toolstripcontainer2 Bottom-Panel eine Statusleiste2

    Tritt das von mir beschriebene Phänomen denn nicht bei jedem auf, wie ich dachte?

    EDIT:
    So sieht mein Proggi aus:
    Eine Main-Menuleiste, eine Main-Symbolleiste, darunter drei "Spalten"
    1. Ordnerliste
    2. Dateiliste
    3. Texteditor mit eigender Menuleiste, Symbolleiste und Statusleiste
    darunter die Main-Statusleiste

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

    @Dideldum Mach doch einfach ein kleines Testprogramm, das Deinen Effekt reproduziert, bereinige (ohne obj, bin und vs-Ordner) und zippe es und hänge die ZIP an Deinen Post:
    Erweiterte Antwort => Dateianhänge => 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!
    Hallo @RodFromGermany

    danke Dir - also ist das nicht normal, dass Symbolleistenbuttons und Menupunkte beim Anklicken kein CellEndEdit auslösen?
    Das tun im Übrigen nicht nur meine Main-Menupunkte und Main-Symbolleistenbuttons nicht, sondern auch meine Menupunkte und Symbolleistenbuttons im TextEditor nicht.
    Nur die anderen Controls wie trv, Picturebox, textbox, cefsharp-box lösen beim Focus-Erhalt den CellEndEdit der dgv aus.

    Ich werde Deinen Vorschlag die Tage mal in Angriff nehmen.
    Nur muss ich zuerst meinem PC wieder beibringen, wie ich den haben möchte.
    Habe zwar ein recht aktuelles OS-Backup. Aber Du kennst ja Windows. Je länger man es nutzt, umso langsamer und verstopfter wird dieses OS.
    Daher habe ich mich entschlossen, der euen SSD auch ein jungfräuliches Win10 zu verpassen.
    Und das heisst viiiiiel Arbeit, bis alles wieder so ist, wie ich es haben will.

    Ich melde mich dann mit der Test-Zip wieder...
    Welche Dateien müssen dann in der Zip enthalten sein?

    Beste Grüsse
    Es löst deshalb kein CellEndEdit aus, weil der Bearbeitungsmodus noch aktiv ist. Selbst wenn Du wild im Menü rum klickst, kannst Du danach noch weiter in der DGV-Zelle rumschreiben. Du könntest als SammelEventHandler bei allen Menüpunkten einen gemeinsamen EventHandler dazupacken, der nur das ausführt: DataGridView1.EndEdit(). Aber mal sehen, ob es eine andere Lösung gibt.

    Hierzu noch ein stackoverflow-Beitrag zum Problem.

    ##########

    Hm. Nee, eigentlich ist meine Lösung auch nur die halbe Wahrheit. Man könnte immer noch per Tastatur das Menü erreichen. Und das konnte ich nicht abfangen.
    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“ ()

    Hi Ihr Zwei,

    danke Euch für die Tips.

    Also dann brauche ich nicht weiter Ursachenforschung betreiben, weil die Ursache im Handling der Menuleisten und Symbolleisten seitens des Net-Frameworks liegt.
    Und ich mache damit schon seit gut einer Woche herum und suche in meinem Proggi den Fehler...
    Also war ich dann prinzipiell sogar auf der richtigen Spur.
    Wenn ich mich recht erinnere, habe ich in einem SymbolleistenButton-Handler sogar schon das dgv1_EndEdit getestet.
    War aber, wenn ich mich recht erinnere trotz anschliessendem Application.refresh zu spät ausgeführt worden.
    Daher habe ich es dann damit getestet, den Focus auf ein anderes Control zu setzen, was funktionierte.
    Dann muss ich also allen Menupunkten und Symbolleisten-Buttons ein Hilfskonstrukt einbauen, um das Problem zu umschiffen.
    Nicht wirklich schön...
    Aber wenn es dann fehlerfrei arbeitet (zumindest mit der Maus), ist es ja schon mal besser, als einen Ausnahmefehler zu generieren.

    Beste Grüsse
    Mach das aber mit dynamischer Event-EventHandler-Verlinkung, nicht mit der Handles-Klausel, also z.B. für das Menü:

    VB.NET-Quellcode

    1. For Each ToolStripMenuItem As ToolStripMenuItem In MenuStrip1.Items
    2. AddHandler ToolStripMenuItem.Click, AddressOf EndDgvEdit
    3. Next
    4. Private Sub EndDgvEdit(sender As Object, e As EventArgs)
    5. DataGridView1.EndEdit()
    6. End Sub
    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 @VaporiZed

    danke Dir!
    Das würde die Sache sicher einfacher machen.
    Aber wird der AddHandler denn auch jeweils vor den eigentlichen Befehlen der einzelnen Menupunkt-Handler durchlaufen?
    Denn eben die Routinen der Handler lösen ja den Fehler aus, wenn meine dgv noch keinen EndEdit durchlaufen hat.

    EDIT: Gibt es eigentlich einen Grund, warum die DGV dieses seltsame Verhalten mt Menu und Symbolleisten aufweist?
    Die TRV hat das Problem ja nicht, wenn ich mich nicht irre.
    Muss das heute Abend mal testen, denke aber das TRV beendet automatisch seine Knotenbearbeitung bei Menu- und Symbolleisten-Klicks.

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

    Ich musste erstmal mir zusammenreimen, was Du mit TRV meinst. Aber Deine Aussage kann ich nicht bestätigen. Wenn man bei einem TreeView LabelEdit auf True macht, zur Laufzeit einen Knoten bearbeitet und dann einen Menüpunkt anklickt, wird die Knotenbezeichnungsbearbeitung bei mir nicht beendet. Soweit ich herauslesen konnte, führt ein Klick in ein Menü nicht zum Focusverlust der selektierten Controls und somit auch nicht zu Bearbeitungsende und Validierung.

    Dideldum schrieb:

    Aber wird der AddHandler denn auch jeweils vor den eigentlichen Befehlen der einzelnen Menupunkt-Handler durchlaufen
    Nur, wenn die Verlinkung vor der statischen Verlinkung angemeldet wird. Da aber die statische Verlinkung in der InitializeComponent-Methode gemacht wird, müsstest Du auf die statische Verlinkung mittels Handles-Klausel verzichten und alles dynmaisch mit AddHandler verknüpfen :/ . Oder alle Menüpunkte mit Zusatzfunktion mit dem EndEdit in der ersten Zeile des jeweiligen EventHandlers versehen.
    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.

    Dideldum schrieb:

    also ist das nicht normal, dass Symbolleistenbuttons und Menupunkte beim Anklicken kein CellEndEdit auslösen?
    Doch, das ist leider so: wenn der Focus scheinbar aufs Menü übergeht, geht er deswegen nicht vom momentan focussierten Control weg. Und daher auch keine EndEdit-Events etc.
    Probierma das:

    VB.NET-Quellcode

    1. Private Sub MenuStrip1_ItemClicked(sender As Object, e As ToolStripItemClickedEventArgs) Handles MenuStrip1.ItemClicked
    2. MenuStrip1.Focus
    3. End Sub
    ItemClicked wird gefeuert egal welches MenuItem geklickst wird. Und dann halt den Focus ausdrücklich aufs Menustrip selbst verlegen - das sollte dann dgv_CellEndEdit etc. auslösen.
    Kann wie oben schon gesagt leider ausgetrickst werden, indem man das Menü per Tasten steuert.

    VaporiZed schrieb:

    Ich musste erstmal mir zusammenreimen, was Du mit TRV meinst. Aber Deine Aussage kann ich nicht bestätigen. Wenn man bei einem TreeView LabelEdit auf True macht, zur Laufzeit einen Knoten bearbeitet und dann einen Menüpunkt anklickt, wird die Knotenbezeichnungsbearbeitung bei mir nicht beendet. Soweit ich herauslesen konnte, führt ein Klick in ein Menü nicht zum Focusverlust der selektierten Controls und somit auch nicht zu Bearbeitungsende und Validierung.
    ...
    Nur, wenn die Verlinkung vor der statischen Verlinkung angemeldet wird. Da aber die statische Verlinkung in der InitializeComponent-Methode gemacht wird, müsstest Du auf die statische Verlinkung mittels Handles-Klausel verzichten und alles dynmaisch mit AddHandler verknüpfen :/ . Oder alle Menüpunkte mit Zusatzfunktion mit dem EndEdit in der ersten Zeile des jeweiligen EventHandlers versehen.


    Hallo @VaporiZed
    danke Dir!
    Ja, da hast richtig interpretiert - TRV ist das Kürzel für meine TreeView-Box.
    Seltsamerweise kommt es bei meiner TRV nicht zur Menu-Handler-Kollision, wenn ich in der TRV einen Knoten bearbeite und den Menubutton anklicke, der in der DGV einen Fehler auslöst.
    Die Knoten-Änderung wird dann einfach verworfen.
    Aber das kann natürlich auch an dem Menubutton-Handler liegen.
    In diesem Handler lasse ich die Nodes der TRV und die Einträge in der DGV neu aus dem Dateisystem neu einlesen.
    Deine Lösung funktioniert sicher, erfordert aber einen extremen Aufwand. Zu den 50 Menupunkten und 50 Symbolleisten-Buttons kommen ja noch ca. 50 Menu-Punkte und Symbolleisten-Buttons meiner Text-, Pic- und CEFSharp-Box hinzu, in die ich das "EndEdit" einbauen müsste. Das hebe ich mir als letzte Lösung auf.

    Hi @ErfinderDesRades
    Danke auch Dir!
    Das werde ich heute Abend testen - hier müsste ich nur an fünf Stellen Änderungen vornehmen.
    Das wäre sehr angenehm.

    Mein Proggi funzt übrigens so:
    Links eine Treeview, welche die Verzeichnisse eines gewählten Archivs (Stammordner) anzeigt
    Mitte ein Datagridview, in dem die im linken TRV ausgewählten Ordner enthaltenen Dateien angezeigt werden.
    Rechts je nach ausgewählter Dateiart in der mittleren DGV entweder eine Textbox, eine PicBox oder eine Cefsharp-Box mit jeweils eigenen Menus und Symbolleisten.
    Es ist also eine Art Multi-Editor mit immer angezeigten Ordner- und Objektlisten.
    Sotele,

    Habe dank Eurer Hilfe eine pragmatische Lösung gefunden, indem ich den Ansatz von hier übernommen habe:
    stackoverflow.com/questions/48…idview-on-menu-item-click

    Quellcode

    1. If Not grid.CurrentCell Is Nothing Then
    2. If grid.CurrentCell.IsInEditMode Then
    3. grid.EndEdit()
    4. End If
    5. End If


    Das habe ich in die betreffenden Handler eingebaut und damit ist das Problem beseitigt.

    Danke Euch Beiden nochmal recht herzlich. :)

    Beste Grüsse