Usercontrol lässt sich nicht in DLL exportieren

  • VB.NET

Es gibt 6 Antworten in diesem Thema. Der letzte Beitrag () ist von Aeonos.

    Usercontrol lässt sich nicht in DLL exportieren

    Hallo Leute,

    ich habe in einem Projekt ein Benutzerdefiniertes Steuerelement hinzugefügt und zwar, indem ich eine Picturebox um ein paar Eigenschaften und Subs erweitert hab.

    VB.NET-Quellcode

    1. Public Class NDPictureBox
    2. Inherits System.Windows.Forms.Picturebox
    3. ......
    4. End Class


    Ich kann das Control zwar auf meiner Form anordnen im gleichen Projekt, aber im Designer von dem Control selbst ist nicht zu sehen. Dort steht nur der Informationstext, dass ich neue Steuerelemente dorthin ziehen soll, um ein Control zusammen zustellen. Da ich am äußeren nichts ändern will, war mir das zuerst egal.

    Jetzt wollte ich das Control gerne in eine Klassenbibliothek packen um es anderen zugänglich zu machen, aber dort wird Inherits System.Windows.Forms.Picturebox nicht akzeptiert, weil es sich mit der Basisklasse Usercotnrol nicht verträgt oder so... versteh ich noch nicht richtig. Wenn ich aber dann in der Designer Datei das Inherits von Usercontrol auf Picturebox stelle, dann wird mir im Desinger nichts mehr angezeigt.

    Ich möchte also konkret wissen, warum funktioniert mein Usercontrol in der Klassenbibliothek nicht, auch wenn ich es in meinem Testprojekt einwandfrei verwenen kann ? Warum kann ich im Designer kein Control sehen, obwohl ich Inherits System.Windows.Forms.Picturebox geschrieben hab ?

    Danke schonmal im Vorraus, Aeonos

    Aeonos schrieb:

    Jetzt wollte ich das Control gerne in eine Klassenbibliothek packen

    Dann musst du auch eine Klassenbibliothek und kein "Benutzersteuerelement" verwenden... :) Kopiere einfach deine Klasse komplett in die Zwischenablage und füge sie in ein Projekt vom Typ "Klassenbibliothek" ein. Nach dem Erstellen erhälst du eine Datei, die du in der Toolbox unter "Elemente auswählen-->Durchsuchen" verwenden kannst. Vergiss nicht, die erforderlichen Verweise zu setzen, denn die Klassenbibliothek kennt z.B. nicht von vornherein den System.Windows.Forms-Namespace, der die PictureBox enthält.

    PS: Um ein Element im Designer sichtbar zu machen, musst du ihm das explizit durch ein Attribut vor der Klasse mitteilen. Es lautet: <System.ComponentModel.DesignTimeVisibleAttribute(True)>
    Gruß
    hal2000
    Vielen dank, hat funktioniert ;)

    Ich habe jetzt ein Problem, bei einer neuen Eigenschaft von meinem Control. Ich dachte ich schreibs hier rein, damit ich nicht extra ein neues Thema aufmachne muss und es gehört ja irgendwie dazu.

    Ich habe eine neue Eigenschaft erstellt, die in der IDE oder während der Laufzeit veränderbar sein soll. Da für diese nur ganz spezielle Werte zugelassen sind, wollte ich das elegant lösen und hab folgendes gemacht, das so aussieht.

    VB.NET-Quellcode

    1. Public Enum NDecoder As Byte
    2. ''' <summary>
    3. ''' Version 1.0
    4. ''' </summary>
    5. ''' <remarks></remarks>
    6. Decoder1 = 15
    7. ''' <summary>
    8. ''' Version 2.0
    9. ''' </summary>
    10. ''' <remarks></remarks>
    11. Decoder2 = 255
    12. End Enum


    Die Eigenschaft hab ich dann dementsprechend gestaltet.

    VB.NET-Quellcode

    1. Private _Decoder as NDecoder
    2. Public Property Decoder() As NDecoder
    3. Get
    4. Return [Enum].GetName(GetType(NDecoder), _Decoder)
    5. End Get
    6. Set(ByVal value As NDecoder)
    7. If [Enum].IsDefined(GetType(NDDecoder), value) Then
    8. MsgBox([Enum].Parse(GetType(NDecoder), value))
    9. _Decoder = [Enum].GetValues(GetType(NDecoder))([Array].IndexOf([Enum].GetValues(GetType(NDecoder)), value))
    10. Else
    11. MsgBox("The value " & value & " is not valid for this property.", MsgBoxStyle.Critical)
    12. End If
    13. End Set
    14. End Property


    In der IDE erscheint zwar eine Dropdown Liste mit der Enumeration drin, allerdings kriege ich immer den Fehler "ungültige Konvertierung der Zeichenfolge [das Element] in den Type Byte" und ich weis nicht, wie ich das beheben kann. Ich hab schon verschiedens versucht, aber das wird leider nur komplizierter und hat bis jetzt nichts geholfen.

    Würde mich sehr über Hilfe freuen :)

    LG, Aeonos
    ich mache sowas immer so ^^
    schreibs um und es sollte funzen:

    VB.NET-Quellcode

    1. Public Enum Test
    2. Wert1
    3. Wert2
    4. Wert3
    5. Wert4
    6. End Enum
    7. Dim MeineVariable as Test = Test.Wert1
    8. Public Property MeineEigenschaft() as Test
    9. Get
    10. Return MeineVariable
    11. End Get
    12. Set(byVal value as Test)
    13. MeineVariable = value
    14. ''sonstiges
    15. End Set
    16. ''generated by My.QnDGenerator
    17. End Property
    Die Überprüfung im Set-Accessor ist nicht ganz so kompliziert: Siehe Beispiel.

    VB.NET-Quellcode

    1. Module Module1
    2. Sub Main()
    3. aaa.xyz = CType(50, MyEnum) 'geht
    4. aaa.xyz = CType(25, MyEnum) 'geht nicht, weil nur 50 und 100 enthalten sind.
    5. End Sub
    6. End Module
    7. Public Class aaa
    8. Private Shared _x As MyEnum
    9. Public Shared Property xyz() As MyEnum
    10. Get
    11. Return _x
    12. End Get
    13. Set(ByVal value As MyEnum)
    14. If [Enum].IsDefined(GetType(MyEnum), value) Then
    15. _x = value
    16. Else
    17. Throw New ArgumentException("Den Wert will ich nicht!!!")
    18. End If
    19. End Set
    20. End Property
    21. End Class
    22. Public Enum MyEnum
    23. a = 100
    24. b = 50
    25. End Enum

    Wenn dazu Fragen sind, beantworte ich sie gerne gegen heute Mittag xD ...
    Gruß
    hal2000
    ich bin verwirrt was willst du mit dem ganzen CType und IsDefined (ich kenn ihre Funktion) ?