Announcement

Collapse
No announcement yet.

Warum kann ich mein User-Control nicht einbinden???

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

  • Warum kann ich mein User-Control nicht einbinden???

    Hallo zusammen,

    ich habe ein merkwürdiges Phänomen im Forms-Designer von Visual Studio 2008. Ich habe ein komplexes Formular mit mehreren Tab-Reitern zu erweitern. Den Inhalt des Tab-Reiters habe ich in einem User-Control gekapselt. Wenn ich nun mein User-Control aus der Toolbox auf mein Formular ziehe, scheint zunächst alles zu funktionieren. Kompiliere ich die Anwendung, gibt der Forms-Designer folgende Fehlermeldung aus:

    The variable'xxx' is either undeclared or was never assigned.

    Grund hierfür ist, dass der Designer den Code zur Instantiierung (sprich New ...) nicht generiert hat. Ich habe die fehlende Zeile einfach manuell hinzugefügt. Danach kommt die Fehlermeldung zwar noch immer, aber wenn ich das Formular schließe und wieder öffne ist alles in Ordnung (bis ich das nächste Mal kompiliere).

    Wenn ich das User-Control aus dem Formular entferne, habe ich generell keine Probleme. Ich muss also in meinem User-Control irgendetwas kodiert haben, was der Forms-Designer nicht mag.

    Hat irgendjemand schon ähnliche Erfahrungen gemacht?

    Vielen Dank im Voraus für eure Hilfe
    Klaus

  • #2
    Kannst du uns den Code des UserControls zeigen?

    Comment


    • #3
      Leider nein, da mein Kunde dass nicht zulässt. Ich werde aber versuchen, schnellstmöglich eine anonymisierte Version des User-Controls zu bauen und den Code zu püosten.

      Die Anwendung arbeitet intensiv mit dem Farpoint-Spread (in der Version 4.5). Auch mein Formular und mein User-Control verwenden das Spread-Control. Kann mein Problem hiermit zusammenhängen?

      Gruß
      Klaus

      Comment


      • #4
        Die Anwendung arbeitet intensiv mit dem Farpoint-Spread (in der Version 4.5). Auch mein Formular und mein User-Control verwenden das Spread-Control. Kann mein Problem hiermit zusammenhängen?
        Wenn du meinst das es am Control liegt und nicht daran wie du das Control benutzt ist das eher unwahrscheinlich Aber das lässt sich ja leicht ausprobieren in dem du das Control einfach mal von deinem UserControl entfernst und siehst wie es sich ohne verhält.

        Comment


        • #5
          die Idee, dass das Farpoint-Spread eine Rolle spielen könnte, war eine Sackgasse.

          ich habe eine abgespeckte Version des User-Controls als Attachment angehängt. Die Methoden und Events sind vollständig vorhanden, ich habe lediglich teilweise den Code entfernt, auch um das ganze nicht zu länglich werden zu lassen .

          Da ich ein Fan expliziter Initialisierung bin, gibt es die Methode InitControl(), in welcher das User-Control intialisiert wird. Diese Methode wird explizit im Parent-Formular aufgerufen, und zwar dann, wenn die darzustellenden Daten gelesen wurden. Wie du im Code siehst, wird im Konstruktor ausser InitialzeComponent() nur noch eine Member-Variable initialisiert, welche ein Slider-Control, welches auf dem User-Control liegt, verwaltet. Ich sehe keinen Grund, warum der Forms-Designer mit diesem Control Schwierigkeiten haben sollte.

          Das Parent-Formular kann ich leider nicht so ohne weiteres abspecken. Ab und an habe ich mit diesem Formular ein weiteres Problem. Wenn ich im Designer das erste Control in der TabIndex-Reihenfolge auswählen möchte, wird ein ganz anderes Control selektiert (immer das selbe). Ich kann die Auswahl nicht mit der Maus treffen, sondern muss das Control im Property-Editor selektieren, damit es im Designer markiert ist. Wenn ich das Control, das statt dessen markiert wird aus dem Formular entferne und neu hinzufüge dann funktioniert die Selektion wieder, bis ich das nächste Mal kompiliere.

          Alein die Designer-Datei des Parent-Formulars hat ca 6.500 Zeilen Code. Kann es sein dass der Forms-Designer in der Größe bzw. Komplexität des Codes in der Designer-Datei eingeschränkt ist?

          Gruß
          Klaus
          Attached Files

          Comment


          • #6
            Aus dem Codefragment lässt sich leider nichts ersehen.

            Bleiben Spekulationen. Deine, das die die Designer Datei zu groß ist, würde ich ausschließen. Die Form zu refaktorieren ist aber eigentlich immer eine gute Idee. Da du da selber schon Zweifel zu haben scheinst ob das so wie es ist gut ist und du scheinbar mit UserControls vertraut bist wäre das eine Maßnahme die weiter zu zerlegen.

            Andere Spekulation - stammen die Controls auf deinem UserControl noch aus einer 3.Assembly? Ich kenne das Problem das Visual Studio dann nicht weiß wie es die Referenzen nachzuziehen hat. Also wenn du dein Mainform in Assembly A hast, dein UserControl in Assembly B und die Controls auf dem UserControl sich in Assembly C befinden wird Visual Studio zwar die Referenz auf Assembly B hinzufügen(wenn die fehlt) wenn du das UserControl auf die Form ziehst aber eben nicht auch Assembly C hinzufügen. In dem Fall sollte man so Probleme haben wie du sie beschreibst. Dann sollte man bevor man das UserControl auf die Form zieht alle notwendigen indirekten Assemblies selbst zuvor referenzieren.

            Comment


            • #7
              Originally posted by Ralf Jansen View Post
              Aus dem Codefragment lässt sich leider nichts ersehen.
              Das habe ich befürchtet.

              Originally posted by Ralf Jansen View Post
              Andere Spekulation - stammen die Controls auf deinem UserControl noch aus einer 3.Assembly?
              Die Anwendung besteht nur aus der EXE und neben dem Farpoint Spread werden nur selbst geschriebene User-Controls (z.T. in separaten Assemblies) verwendet. Mein User-Control enthält neben einem Farpoint-Spread nur noch eine Combobox.

              Das Refactoring des Parent-Formulars würde ich zwar gerne durchführen, aber ich befürchte, mein Kunde wird mir das nicht bezahlen, da es auf Grund der Komplexität des Codes relativ aufwändig ist.

              Ich werde mal überprüfen, ob das Problem unter Visual Studio 2010 auch auftritt. Wenn nicht, haben meine Ansprechpartner beim Kunden ein weiteres Argument, auf VS 2010 umzusteigen . Ansonsten werde ich versuchen, die InitializeComponent()-Methode im Parent-Formular zu verschlanken (da gibt es Möglichkeiten, den vom Farpoint Spread generierten Code zu reduzieren).

              Vielen Dank für deine Mühe
              Klaus

              Comment


              • #8
                gerade habe ich die Lösung für mein Problem gefunden. Letztendlich hat mich dein Hinweis mit den Referenzen darauf gebracht. Das Problem war, dass ich den Scope des User-Controls auf "Friend" gesetzt habe. Der Forms-Designer arbeitet vermutlich mit Reflection und ermittelt alle "Public" Properties, Funktionen und Methoden. Da ich auch den Konstruktor meines User-Controls als "Friend" deklariert habe, konnte der Forms-Designer diesen wohl nicht finden und hat deswegen keinen Code zum Instantiieren des Controls erzeugt.

                Gruß
                Klaus

                Comment


                • #9
                  Ah, gut zu wissen. Danke das du deine Entdeckung zurückgemeldet hast.

                  Der Winforms Designer hat nicht mehr Rechte als andere in deinem Code. Und wenn du sagst dein Control ist nur für ~Freunde~ (aka Klassen die in der selben Assembly stecken) ist natürlich auch der Winforms Designer wie alle anderen ausgeschlossen. (Aber man hätte es an deinem Codefragment sehen können )

                  Comment


                  • #10
                    es sind oft die offensichtlichen Dinge, die man übersieht

                    Comment

                    Working...
                    X