Unerklärliches (absurdes) Verhalten des Form1.Designers

  • VB.NET
  • .NET 7–8

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

    Unerklärliches (absurdes) Verhalten des Form1.Designers

    Liebe Forumgemeinde,

    wurde Ähnliches schon mal berichtet?
    Wiederholt entwickelt der Form1.Designer eine seltsame Verdoppelung des Programm-Namens ("TestmitXML") (Angabe Zeile 177 im angehängten Bild). Die Folge ist einerseits, dass das Entwurfsformular nicht mehr generiert werden kann, es kam aber auch (mit frgl. Zusammenhang zu diesem seit Tagen beobachteten Verhalten) zu Programmabstürzen. Wenn ich die Namens-Verdoppelung im Designer lösche, kann das Entwurfsformular auch wieder generiert werden. Da Speichern und Lesen mit writexml und readxml eines Dataset aber ohnehin noch nicht funktioniert (Dataset,Table ist nothing), bin ich bei weiteren Programmkorrekturen immer wieder auf das Funktionieren der Entwurfsansicht angewiesen. Und so ist es sehr mühsam, immer wieder auch den Form1.Designer zu korrigieren.
    Was kann evtl. eine Fehlerursache sein?
    Danke vorab für Ideen-Weitergabe !
    Bilder
    • Fehlermeldung XML.jpg

      227,36 kB, 1.920×1.080, 61 mal angesehen
    Kannst Du mal bitte das Projekt ohne bin-, obj-, .vs- und .git-Ordner und gezippt über [+ Erweiterte Antwort] hochladen? Vielleicht finden wir so das Problem und eine Lösung.
    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.
    Ja wurde es, hier ist alles dokumentiert, was dazu bekannt ist. Es fängt erst ein bisschen wirr an, kommt der Sache aber auf den Grund.
    Für das Problem, das jener Thread beschreibt ist auch bereits ein Fix erfolgt mit VS 17.5! Wenn du diese oder eine höhere Version hast, dann musst ggf. prüfen ob bei dir nicht vielleicht doch andere Bedingungen vorliegen.

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

    Unerklärliches (absurdes) Verhalten des Form1.Designers

    Vielen Dank für die rasche Antwort!
    Aus dem alten Thread scheint ja schlüssig hervorzugehen, dass es mit der Verwendung des Dataset zu tun hat. Denselben Eindruck hatte ich während
    der bisherigen Programmerstellung. Ich hänge die gezippten Dateien an. Bitte um Nachsicht meines laienhaften Programmierstils, bin eigentlich noch
    immer Anfänger...
    Danke für die Hilfe !
    Dateien
    Zu "Haudruf...":
    In der Schlusspassage des von Dir angegebenen Thread wird gesagt, dass dieses "Duplizier-Problem" in der Version
    von VS 17.5. behoben wurde. Dies kann ich leider nicht bestätigen. Mit dem MS VS-Update dieser Tage handelt es sich laut Info
    um Version 17.8.3. Und dennoch entsteht wiederkehrend dieses Problem, Dies ist deshalb betrüblich, da das Programm ja noch
    nicht läuft, d. h. noch im Entstehen ist (wobei in einer früheren Version der Teil "Auswertung" bereits funktionierte).
    Hat jemand eine Idee?
    Das ist richtig, das habe ich auch dazu geschrieben. Ich habe allerdings noch nicht in dein Beispielprojekt reingucken können. Ich denke heute Abend. Oder jemand anders schaut vorher drüber.

    In der Zwischenzeit kannst du ja vielleicht schon Unterschiede feststellen. Der Thread enthält auch ein Beispielprojekt. Es ist ja auch nicht ausgeschlossen, dass das Problem aus jenem Thread nun wieder "kaputt gefixt" wurde.
    Einen Unterschied sehe ich aber so schon, bei mir haben andere Klassen nicht funktioniert, bei dir funktioniert das DataSet selbst nicht.

    -Edit-
    @woofy49 Also ich kann das Problem nachstellen. Man muss nur ein frisches NET 6 Projekt machen und versuchen ein DataSet auf Form zu kriegen.
    Ich war damals schon der Meinung, dass das Problem in dem alten Thread nicht gelöst sondern umgangen wurde. Erstaunlicherweise konnte ich DataSets noch zu den Zeiten 17.5 in NET 6 nutzen. Aber jetzt scheint das nicht mehr zu gehen und zwar aus demselben Grund wie in dem anderen Thread nämlich Namespace-Salat.

    Ich kann mir gut vorstellen, dass @loeffel das interessiert, da er sich auch maßgeblich mit dem ersten Problem beschäftigt hat.
    Es ist schon ein Jahr her, damals schrieb er, man sucht nach DataSet-Problemen.
    Dieses Spezielle springt einen allerdings etwas sehr auffällig an.

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „Haudruferzappeltnoch“ ()

    Hallo "Haudruf...",

    beim Versuch, unter VS 2022 net 6.0 im DataGridView eine Verbindung zu Daten (konkret beim Anklicken
    des kleinen Dreiecks an der oberen rechten DGV-Ecke) stürzt VS regelmäßig ab ("keine Rückmeldung"). Ich hatte leider
    nicht mehr in Erinnerung, dass ich dieses Verhalten schon vor Wochen sah, weshalb ich auf eine andere net-Version
    umgestiegen war. Es ist also kein zufälliges, sondern sich wiederholendes Verhalten beim Versuch, ein DGV mit einem/r Dataset
    bzw. BindingSource zu verknüpfen :(
    Ich lese aktiv mit seit heute, ja!

    Ist das bei euch ein VB-only Problem, oder ist C# ebenfalls betroffen?

    Wenn es bis 17.5.3 funktioniert hat, dann wird es eine Regression sein, die wir bei der Umstellung der Codegenerierung von CodeModel auf Roslyn verursacht haben. Es gibt gerade bei VB noch einige andere Dinge, die wir fuer 17.9 Preview 3 angehen.

    Werde mir es genauer anschauen und mich dann melden.
    Da sagst du was. Nein, Bei C# besteht dieses Problem nicht.

    Hier die Gegenüberstellung zweier frischer Projekte (c#/vb) nach dem eine DataSet-Komponente ins Projekt eingefügt wurde:

    Dauert keine Minute zum Nachstellen.

    Wenn man kompiliert und das DataSet aufs Form zieht, dann wird es im Designer als WinFormsApp1.WinFormsApp1.DataSet1 deklariert.
    Und das kann er nicht finden.

    Zu 17.5:
    Nach meinem (wirklich beschränkten!) Verständnis ist es keine Regression, denn dieser Namespace existierte schon vor VS 17.5. Und das wurde in 17.5 auch nicht behoben; dort wurde die Deklaration von projektinternen Klassen im Forms-Designer umgebaut und das ist auch heute noch gültig. Wo WinFormsApp1.MyLittleClass stand, steht nur noch MyLittleClass. Dadurch werden projektinterne Klasse nicht mehr durch den extra Namespace verwirrt
    Dieser Namespace wird aufgrund von Namensgleichheit nicht richtig aufgelöst im Designer. Bei MyLittleClass hat vor 17.5 verhindert, dass sie erkannt werden. Bei DataSet1 verhindert er nun das sie erkannt wird.
    Wobei nach der Logik WinFormsApp1.DataSet1 da nun stehen muss, also genauso wie eine Projektklasse vor 17.5 im Designer angegeben wurde. Damals habe ich das alles noch nicht überblickt, aber vielleicht ist dieser Fehler auch durch den Fix in 17.5 entstanden.

    Fakt ist aber: Ohne den Namespace WinFormsApp1.WinFormsApp1 gibt es keine Probleme weder mit DataSet noch mit projektinternen Klassen (siehe C#).

    Anbei auch nochmal das Minimal-Beispiel im aktiven Fehlerzustand.
    Dateien
    Nach mehreren Versuchen, Dataset - DataTable in Code einzubinden, gebe ich diese Vorgehensweise auf.
    Wiederholt war die Form1[Entwurf]-Ansicht nicht möglich, das andere Phänomen, was mich immer wieder ausgebremst hat,
    wenn nicht gerade wieder die "Verdoppelung" wie oben beschrieben nervte.
    Die letzte Meldung des Form1-Designers möchte ich Euch aber nicht vorenthalten, vielleicht hilft er
    Euch Fachleuten doch irgendwie weiter...
    Danke für Euer Interesse und Eure Hilfe !

    Hier die Fehlermeldung:

    Nicht unterstützter Wert von "statement": Microsoft.DotNet.DesignTools.Client.CodeDom.CodeBodyTextStatement.
    Um mögliche Datenverluste zu verhindern, müssen vor dem Laden des Designers folgende Fehler behoben werden:

    Quellcode

    1. bei Microsoft.DotNet.DesignTools.Protocol.DataPipe.CodeDomExtensions.WriteProperties(IDataPipeWriter writer, CodeStatement statement)
    2. bei Microsoft.DotNet.DesignTools.Protocol.DataPipe.Binary.BinaryDataPipeWriter.WriteObject[T](T obj, Action`2 propertyWriter)
    3. bei Microsoft.DotNet.DesignTools.Protocol.DataPipe.Binary.BinaryDataPipeWriter.WriteArrayElements[T](IEnumerable`1 elements, Action`2 elementWriter)
    4. bei Microsoft.DotNet.DesignTools.Protocol.DataPipe.CodeDomExtensions.WriteProperties(IDataPipeWriter writer, CodeMemberMethod memberMethod, CodeDomOptions options)
    5. bei Microsoft.DotNet.DesignTools.Protocol.DataPipe.Binary.BinaryDataPipeWriter.WriteObject[T](T obj, Action`2 propertyWriter)
    6. bei Microsoft.DotNet.DesignTools.Protocol.DataPipe.Binary.BinaryDataPipeWriter.WriteArrayElements[T](IEnumerable`1 elements, Action`2 elementWriter)
    7. bei Microsoft.DotNet.DesignTools.Protocol.DataPipe.CodeDomExtensions.<>c__DisplayClass139_0.b__0(IDataPipeWriter , CodeTypeDeclaration )
    8. bei Microsoft.DotNet.DesignTools.Protocol.DataPipe.Binary.BinaryDataPipeWriter.WriteObject[T](T obj, Action`2 propertyWriter)
    9. bei Microsoft.DotNet.DesignTools.Protocol.Endpoints.Sessions.InitializeRootComponentRequest.WriteProperties(IDataPipeWriter writer)
    10. bei Microsoft.DotNet.DesignTools.Protocol.Endpoints.Endpoint`2.Microsoft.DotNet.DesignTools.Protocol.Endpoints.IEndpoint.WriteRequest(IDataPipeWriter writer, Request request)
    11. bei Microsoft.DotNet.DesignTools.Protocol.DataPipe.Binary.BinaryDataPipeWriter.WriteArrayElements[T](IEnumerable`1 elements, Action`2 elementWriter)
    12. bei Microsoft.DotNet.DesignTools.Protocol.DataPipe.Binary.BinaryMessageFormatter.g__WriteRpcRequest|8_0(BinaryDataPipeWriter writer, JsonRpcRequest rpcRequest)
    13. bei Microsoft.DotNet.DesignTools.Protocol.DataPipe.Binary.BinaryMessageFormatter.StreamJsonRpc.IJsonRpcMessageFormatter.Serialize(IBufferWriter`1 bufferWriter, JsonRpcMessage message)
    14. bei StreamJsonRpc.LengthHeaderMessageHandler.Write(JsonRpcMessage content, CancellationToken cancellationToken)
    15. bei StreamJsonRpc.PipeMessageHandler.WriteCoreAsync(JsonRpcMessage content, CancellationToken cancellationToken)
    16. bei StreamJsonRpc.MessageHandlerBase.d__23.MoveNext()
    17. --- Ende der Stapelüberwachung vom vorhergehenden Ort, an dem die Ausnahme ausgelöst wurde ---
    18. bei System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
    19. bei System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
    20. bei StreamJsonRpc.JsonRpc.d__157.MoveNext()
    21. --- Ende der Stapelüberwachung vom vorhergehenden Ort, an dem die Ausnahme ausgelöst wurde ---
    22. bei System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
    23. bei System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
    24. bei StreamJsonRpc.JsonRpc.d__162.MoveNext()
    25. --- Ende der Stapelüberwachung vom vorhergehenden Ort, an dem die Ausnahme ausgelöst wurde ---
    26. bei System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
    27. bei System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
    28. bei StreamJsonRpc.JsonRpc.d__151`1.MoveNext()
    29. --- Ende der Stapelüberwachung vom vorhergehenden Ort, an dem die Ausnahme ausgelöst wurde ---
    30. bei System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
    31. bei System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
    32. bei Microsoft.DotNet.DesignTools.Client.DesignToolsClient.d__49`1.MoveNext()
    33. --- Ende der Stapelüberwachung vom vorhergehenden Ort, an dem die Ausnahme ausgelöst wurde ---
    34. bei System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
    35. bei System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
    36. bei Microsoft.VisualStudio.Threading.JoinableTask.CompleteOnCurrentThread()
    37. bei Microsoft.VisualStudio.Threading.JoinableTask`1.CompleteOnCurrentThread()
    38. bei Microsoft.DotNet.DesignTools.Protocol.Endpoints.DesignToolsEndpoints.SessionsImpl.InitializeRootComponent(SessionId sessionId, CodeTypeDeclaration typeDeclaration, String rootComponentClassName, ResourceContentData[] resourceDocDataContent, String basePath)
    39. bei Microsoft.DotNet.DesignTools.Client.DesignerSession.InitializeRootComponent(CodeTypeDeclaration typeDeclaration, String rootComponentClassName, ResourceContentData[] resourceDocDataContent, String basePath)
    40. bei Microsoft.DotNet.DesignTools.Client.Loader.VsDesignerLoader.d__59.MoveNext()
    41. --- Ende der Stapelüberwachung vom vorhergehenden Ort, an dem die Ausnahme ausgelöst wurde ---
    42. bei System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
    43. bei System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
    44. bei Microsoft.DotNet.DesignTools.Client.Loader.VsDesignerLoader.<>c__DisplayClass57_0.<b__1>d.MoveNext()


    Code-Tags eingefügt. ~Thunderbolt

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

    Hey, sorry, dass es etwas laenger gedauert hat.

    Ich denke momentan vorsichtig, dass das Problem nichts mit dem WinForms Designer zu tun hat.
    Unter .NET und im Gegensatz zu .NET Framework generiert das DataSet-Generator-Tool eine Namespace-Anweisung, die es nicht generieren duerfte, bzw. es koennte sie generieren, wenn es dem Namespace-Namen ein `Global.` voranstellen wuerde. Und das ist das eigentliche Problem. Denn wenn deine Anwendung "DsDemo" heisst, dann moechtest du wahrscheinlich, dass sich deine DataSets im Namespace "DsDemo" und nicht im Namespace "DsDemo.DsDemo" befinden.

    Welche Moeglichkeiten hasst du als Woerkaround?

    * Wenn dich die doppelten Namespacenamen nicht stoeren, kannst du sie im CodeBehind-File importieren. Die Namespace-Imports im Code-Behind-File bleiben naemlich immer erhalten - lediglich alles was in `InitializeComponent` steht, wird bei jedem Designer-Flush neu generiert. Also...

    ```
    Imports testmitXML.testmitXML

    <Global.Microsoft.VisualBasic.CompilerServices.DesignerGenerated()>
    Partial Class Form1
    Inherits System.Windows.Forms.Form
    ```

    ...dann laesst du den Typnamen ohne Namespace stehen, und beim naechsten Roundtrip kann der Designer dann beim Simplifying des Codes auf die Imports-Anweisung zurueckgreifen, und braucht keine vollqualifizierten Typnamen zu emitten.

    * Oder du trickst den DataSet-Generator aus. Er sollte ja eigentlich ohnehin keine Namespace-Anweisung generieren - tut das aber. Wir muessen ihne also zwingen, eine zu generieren, die passt. Wenn du die DataSet-Datei im Solution-Explorer selektierst, siehst du im Property Window eine Eigenschaft namens Custom Tool Namespace. Dort muessten wir nun einen vollstaendigen Pfad eintragen, also einen, der mit `Global` beginnt. Das geht aber nicht einfach, da die Zeichenkette `Global` in ein CodeDOM Objekt umgewandelt wird, und damit der Basic-Codegenerator dann einen Identifier generieren kann, der nicht mit dem Global-VB-Schluesselwort kollidiert, packt er das Global automatisch in eckige Klammern - und genau das wollen wir ja nicht. Aber wenn wir unserem Voll-Pfad-Namespace nicht `Global` sondern `Global[space]` voranstellen, packt CodeDOM den Identifier-String NICHT in eckige Klammern, und der VB-Compiler ist aber ausreichend verzeihend, dass er das zusaetliche Leerzeichen ignoriert. Also `Global .einxmlTest` sollte dann funktionieren: In diesem Fall generiert das Tool die Zeile `Namespace global .einxmlTest`, was zwar nicht schoen ausschaut, sich aber problemlos kompilieren laesst.

    Hope that helps!

    Gruss aus Redmond,

    Klaus

    loeffel schrieb:

    Oder du trickst den DataSet-Generator aus. Er sollte ja eigentlich ohnehin keine Namespace-Anweisung generieren - tut das aber. Wir muessen ihne also zwingen, eine zu generieren, die passt. Wenn du die DataSet-Datei im Solution-Explorer selektierst, siehst du im Property Window eine Eigenschaft namens Custom Tool Namespace. Dort muessten wir nun einen vollstaendigen Pfad eintragen, also einen, der mit `Global` beginnt
    Funktioniert einwandfrei. (Global .ProjektNamespaceName)
    Und adressiert das Problem absolut an der richtigen Stelle meiner Meinung nach. Ist übrigens auch die richtige Abhilfe für das Problem das in 17.5 anderweitig behoben wurde.
    Das ist auch eine Lösung, die mal wieder zeigt, dass es eigentlich ein Problem von mangelndem Verständnis der User ist. Aber das scheint ja wirklich kaum einer gewusst zu haben!