Konstruktor im UserControl

  • VB.NET
  • .NET 5–6

Es gibt 9 Antworten in diesem Thema. Der letzte Beitrag () ist von loeffel.

    Konstruktor im UserControl

    Habe in einem UserControl einen Konstruktor den ich eigentlich nicht brauche.
    Ursprünglich war die Idee, das UserControl in einem Form zur Laufzeit hinzu zu fügen, jetzt habe ich das im Designer erledigt.
    Allerdings ist es so, dass der _designer.vb Code scheinbar durch die Anwesenheit des Konstruktors im UserControl irgendwie beeinflusst wird:
    verändere ich etwas auf dem Form im Designer und speichere die Änderungen, wird der _designer.vb Code ja neu geschrieben.
    Dabei wird in Private Sub InitializeComponent() interessanter Weise der Eintrag Me.MeinUserControl1 = New MeineAnwendung.MeinUserControl() gelöscht.
    In der Folge kann ich anschließend das Form nicht mehr öffnen, sondern bekomme eine Fehlermeldung.
    Schmeiße ich den Konstruktor aus dem UserControl raus, passiert das nicht.
    Ich habe eine Weile gebraucht um zu verstehen was das Problem ist, versteh aber nicht den Grund.
    Mein Konstruktor sieht folgendermaßen aus:

    VB.NET-Quellcode

    1. 'Standard Konstruktor
    2. Friend Sub New()
    3. Me.InitializeComponent()
    4. End Sub
    5. 'Eigener Konstruktor
    6. Friend Sub New(ByVal iconstructor_ParentUSINr As Integer, _
    7. ByVal iconstructor_ParentModuleNr As Integer, _
    8. ByVal sconstructor_ParentName As String, _
    9. ByVal sconstructor_FSPxxx_FSPImageStatus As String, _
    10. ByVal sconstructor_FSPxxx_FSPImageGenerator As String,
    11. ByVal sconstructor_FSPxxx_ADCConfiguration As String,
    12. ByVal sconstructor_FSPxxx_ADCCalibrationGAIN As String,
    13. ByVal sconstructor_FSPxxx_ADCCalibrationOFFSET As String,
    14. ByVal sconstructor_FSPxxx_ADCFAVResult As String,
    15. ByVal iconstructor_PosLeft As Integer, _
    16. ByVal iconstructor_PosTop As Integer)
    17. Me.InitializeComponent()
    18. iParentUSINr = iconstructor_ParentUSINr
    19. iParentModuleNr = iconstructor_ParentModuleNr
    20. sParentName = sconstructor_ParentName
    21. sFSPxxx_FSPImageStatus = sconstructor_FSPxxx_FSPImageStatus
    22. sFSPxxx_FSPImageGenerator = sconstructor_FSPxxx_FSPImageGenerator
    23. sFSPxxx_ADCConfiguration = sconstructor_FSPxxx_ADCConfiguration
    24. sFSPxxx_ADCCalibrationGAIN = sconstructor_FSPxxx_ADCCalibrationGAIN
    25. sFSPxxx_ADCCalibrationOFFSET = sconstructor_FSPxxx_ADCCalibrationOFFSET
    26. sFSPxxx_ADCFAVResult = sconstructor_FSPxxx_ADCFAVResult
    27. Me.Left = iconstructor_PosLeft
    28. Me.Top = iconstructor_PosTop
    29. End Sub

    Jemand eine Idee?
    @roepke Mach mal die Konstruktoren Public.
    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!
    Danke für die Antworten.
    Mit Public"scheint" es zu funktionieren. Ich schreibe absichtlich „scheint“, weil beim ersten Versuch das Control beim neu Erstellen des Projektes aus dem Designer verschwunden ist, d.h. in der visualisierten Ansicht. In _designer.vb blieben Codefragmente zurück. Beim zweiten Versuch klappte es dann (bisher) ohne Probleme.
    Interessanter Weise habe ich weitere UserControls mit Konstruktoren, die ich allerdings alle zur Laufzeit im Form hinzufüge, die sind auch alle Friend und damit gibt es keine Probleme. Irgendwie klar, werden anders behandelt, sind ja nicht Bestandteile des Designers.
    Trotzdem merkwürdig, dass Public funktionieren soll und Friend nicht. Zuerst dachte ich daran, dass VB2010 das Problem sein könnte, auf dem ich ursprünglich entwickelt habe. Mit VS2017 gibt es aber dasselbe Problem.
    Eins noch: parallel zu den Konstruktoren gibt es auch einige Friend Properties im UserControl, das sollte aber doch auch nicht die Ursache sein, oder?

    Nachtrag: Habe jetzt noch mal Friend aus Public gemacht und „schwupps“ hatte ich wieder mein ursprüngliches Problem, dass Einträge aus _designer.vb verschwinden.
    Aber trifft das auch zu, wenn das UserControl kein eigenständiges, externes Projekt ist, das mittels DLL eingebunden wird?
    In diesem speziellen Fall ist das nämlich so. Das UserControl ist Teil des eigentlichen Projekts, kommt also nicht von extern, sollte also eigentlich auch mit Friend sichtbar sein.
    ich denke für den Designer, der dein UCL anzeigt, ist dein Projekt eine (externe) Dll. Die lädt er, erstellt ein ucl-Objekt, indem er den Standard-Konstruktor aufruft, und zeigt das ucl-Objekt dann an.
    Nicht (viel) anders, als wie es zur Laufzeit auch passiert.

    Vermutlich kannst du deinen eigenen Konstruktor Friend machen, aber der Standard-Konstruktor muss Public.
    Das ist merkwuerdig, und das wuerde ich mir gerne mal genauer anschauen.

    Mein erster Gedanke war, dass der CodeModel-Parser in Visual Studio (das ist der Teil in Visual Studio, der den eigentlichen Programmtext durchlaeuft und einen Objektgraphen aus CodeDom-Objekten herstellt, aus denen dann im Designer das eigentliche Form zur Anzeige generiert wird) nicht mit den VB-Zeilenumbruechen deines Konstruktors klarkommt, und sich deswegen beim Parsen des Konstruktors schon verschluckt. Was passiert, wenn du keine Zeilenumbrueche verwendest und alle Parameter in einer Zeile haeltst?

    Kann aber auch was voellig anderes sein!

    Falls du die Zeit dazu hast, koenntest du mir mal ein kleinstmoegliches Reproprojekt zur Verfuegung stellen (OneDrive, DropBox, etc), mit der wir das nachvollziehen konnen?
    Falls ja, schick mir Link zu dem Projekt dann bitte an klaus punkt loeffelmann at microsoft.com, oder - wenn dir das nix ausmacht - poste den Link hier.

    Danke und schoene Gruesse aus dem gerade verrauchten Redmond!

    Klaus