Array mit versch. Typen - und Eigenschaften

  • VB.NET

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

    Array mit versch. Typen - und Eigenschaften

    Nabend!

    Da mir letztes Mal schnell und perfekt geholfen wurde, wene ich mich doch gleich nochmal an euch ;)
    Also, ich habe ein Array vom Typ Controls, in dem mehrere eigene Steuerelemente stecken (alle von Control eben vererbt). Nun hat aber nicht jedes Element die gleichen Eigenschaften wie die Klasse Control, sondern soll auch eigene besitzen (die anderen werden schon teilweise überschrieben).

    Doch wie setze ich die "persönlichen" Eigenschaften der einzelnen Steuerelemente? Beispiel:

    VB.NET-Quellcode

    1. Private arrControls(0) as Control 'Größe wird angepasst und so, ist hier eher Pseudocode
    2. arrControls(0) = New eigeneButtonKlasse
    3. arrControls(1) = New eigeneCheckboxKlasse
    4. arrControls(0).Text = "geht"
    5. arrControls(1).Text = "geht auch"
    6. arrControls(1).Checked = True 'geht NICHT, da "Checked" keine Eigenschaft von Controls ist


    Hat jemand eine Idee, wie ich das lösen könnte? Das einzige, was mir einfällt, ist für jeden Typ ein eigenes Array zu erstellen, was ich zu Beginn auch erst hatte, aber ein großes sich doch als angenehmer herrausstellte - bis zu diesem Problem.....

    Schönen Abend und danke schonmal fürs Durchlesen ;)
    Eine Struktur machen :
    Struktur
    -> Control As Control
    -> Type As Type

    Dann ein Array von der Struktur verwenden und immer das Control mit CType in den Type konvertieren ;)
    beachte das Kommentar dahinter :

    BadDeath schrieb:

    VB.NET-Quellcode

    1. Private arrControls(0) as Control 'Größe wird angepasst und so, ist hier eher Pseudocode
    Also ich hab das mit einer Struktur wie von Mangafreak1995 geschildert versucht:

    VB.NET-Quellcode

    1. Dim MyControls() As MyControlStructure
    2. Private Structure MyControlStructure
    3. Dim CheckBoxControl As CheckBox 'Wenn auch Buttons ins Array sollen noch eine Zeile mit "Dim ButtonControl As Button"
    4. Dim Type As Type 'Was das Type bringen soll ist mir ein Rätsel
    5. End Structure
    6. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    7. Dim MyCheckBox As New CheckBox
    8. 'Irgendwelche Eigenschaften der CheckBox verändern...
    9. MyControls(0) = CType(MyCheckBox, MyControlStructure) 'Hier kommt dann aber ein Fehler: "Der Wert vom Typ "System.Windows.Forms.CheckBox" kann nicht in "WindowsApplication1.Form1.MyControlStructure" konvertiert werden."
    10. MyControls(0).CheckBoxControl.Checked = True 'Das allerdings würde funktionieren
    11. End Sub


    Wie oben kommentiert lässt sich ein gewisser Wert vom Typ "...CheckBox" nicht in "...MyControlStructure" konvertieren.
    Ich denke wenn man das CheckBox Control in ein "MyControlStructure.CheckBoxControl" konvertieren würde würde es funktionieren.
    Aber wenn man einen Punkt nach MyControlStructure eingibt gibt erkennt man, dass es nichts nach dem Punkt gibt (schlecht erklärt, wenn man es probiert weiß man was ich meine)

    Aber ein Grundstein mit "Dim MyControls() As MyControlStructure" wäre schon mal geschaffen.
    "Luckily luh... luckily it wasn't poi-"
    -- Brady in Wonderland, 23. Februar 2015, 1:56
    Desktop Pinner | ApplicationSettings | OnUtils
    @ Mangafreak, danke schonmal für den Ansatz, aber wie bitte soll ich das nun genau umsetzen? Ich habe es gerade ähnlich probiert, stoße aber auch auf den Fehler von Niko:

    VB.NET-Quellcode

    1. Private testarr(10) As CtlStructure
    2. Private Structure CtlStructure
    3. Dim typ As Type
    4. Dim ctrl As Control
    5. End Structure
    6. ' Checkbox erstellen; CountCOntrols ist eine iterierte Integer-Variable, jaja erstmal nur schnell zum testen
    7. testarr(CountControls).ctrl = New ctlCheckbox
    8. testarr(CountControls).typ = CType(testarr(CountControls).ctrl, ctlCheckbox)


    Da kommt dann nun: "Der Wert vom Typ "Android_Designer.ctlCheckbox" kann nicht in "System.Type" konvertiert werden."

    @ Niko: wenn ich trotzdem noch zwischen den versch. Typen manuell umschalten muss, sprich zwischen den einzelnen Structure-Feldern, kann ich ja auch gleich wieder für die Klasse ein Array nehmen....
    Den richtigen Hinweis hat Mangafreak schon in seinem ersten Beitrag gegeben.
    Stichwort: CType, DirectCast, ...
    Beispiel:

    VB.NET-Quellcode

    1. Public Class Form1
    2. Private _MyControls(3) As Control
    3. Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    4. _MyControls(0) = New A
    5. _MyControls(1) = New B
    6. _MyControls(2) = New C
    7. _MyControls(3) = New D
    8. End Sub
    9. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    10. For Each ctrl As Control In _MyControls
    11. If TypeOf (ctrl) Is A Then MsgBox(DirectCast(ctrl, A).DummyPropertyA.ToString)
    12. If TypeOf (ctrl) Is B Then MsgBox(DirectCast(ctrl, B).DummyPropertyB.ToString)
    13. If TypeOf (ctrl) Is C Then MsgBox(DirectCast(ctrl, C).DummyPropertyC.ToString)
    14. If TypeOf (ctrl) Is D Then MsgBox(DirectCast(ctrl, D).DummyPropertyD.ToString)
    15. Next
    16. End Sub
    17. End Class
    18. Public Class A
    19. Inherits Control
    20. Public ReadOnly Property DummyPropertyA As Integer
    21. Get
    22. Return -1
    23. End Get
    24. End Property
    25. End Class
    26. Public Class B
    27. Inherits Control
    28. Public ReadOnly Property DummyPropertyB As Double
    29. Get
    30. Return 1.9232
    31. End Get
    32. End Property
    33. End Class
    34. Public Class C
    35. Inherits Control
    36. Public ReadOnly Property DummyPropertyC As Boolean
    37. Get
    38. Return False
    39. End Get
    40. End Property
    41. End Class
    42. Public Class D
    43. Inherits Control
    44. Public ReadOnly Property DummyPropertyD As String
    45. Get
    46. Return "KlasseD"
    47. End Get
    48. End Property
    49. End Class
    Danke xtts02 - es klappt perfekt! Also war es eigentlich nur DirectCast statt CType und ohne Structure - was die ganze Sache noch schöner macht ;)

    Schönen Adventstag euch noch - werde mich wohl beim nächsten Problem wieder bei euch melden :whistling:
    Meine Struktur hats nur Variabel gemacht für alles ;) ... CType konvertiert ... DirectCast unterstützt nur schon vorhandene Typen (soweit ich weiß) ... und mein System habt ihr nicht verstanden ?

    VB.NET-Quellcode

    1. Dim arr As New Structure() {}
    2. arr(0).Control = New Checkbox()
    3. arr(0).Control = TypeOf Checkbox ' CheckBox.GetType()
    4. 'Zugriff
    5. CType(arr(0).Control, arr(0).Type).'etc.