Alle Controls von property list (of control) während des designs schon einfügen

  • VB.NET

Es gibt 14 Antworten in diesem Thema. Der letzte Beitrag () ist von ErfinderDesRades.

    Alle Controls von property list (of control) während des designs schon einfügen

    Hallo liebe Community,

    ich habe ein UserControl indem ich folgende Property eingebaut habe:

    VB.NET-Quellcode

    1. Option Strict On
    2. Imports System.Drawing
    3. Imports System.ComponentModel
    4. Imports System.Windows.Forms
    5. Imports System.Drawing.Design
    6. Public Class MetroTileControl : Inherits UserControl
    7. Private _Tiles As New List(Of Tile)
    8. <Browsable(True)>
    9. <Description("A collection of all Tiles")>
    10. <DesignerSerializationVisibility(DesignerSerializationVisibility.Content)>
    11. Public Property Tiles() As List(Of Tile)
    12. Get
    13. Return _Tiles
    14. End Get
    15. Set(ByVal value As List(Of Tile))
    16. _Tiles = value
    17. For i = 0 To _Tiles.Count - 1
    18. Me.Controls.Add(_Tiles(i))
    19. Next
    20. End Set
    21. End Property
    22. End Class


    Nun, mit dem Code gibt es ein Problem undzwar wenn ich im Designer zur Auflistung einen Eintrag hinzufügen will, soll dies direkt in echtzeit auf dem UserControl erstellt werden das 'Tile' (Das Tile ist eine Klasse die vom System.Windows.Forms Panel erbt)
    Nur wenn ich im Sammlungs-Editor auf Ok drücke, scheint mein Code in Zeile 21 irgendwie nicht ausgeführt zu werden.

    Habt Ihr irgendwelche Ideen für mich?
    LG
    Bilder
    • editor.png

      23,37 kB, 842×511, 177 mal angesehen
    Wenn ich dir auf irgendeiner Art und Weise helfen konnte, drück doch bitte den "Hilfreich" Button :thumbup:

    Für VB.NET Entwickler: Option Strict On nicht vergessen!
    @ClonkAndre Werden die ggf. alle an derselben Position eingefügt?
    Kannst Du denen unterschiedliche Farben und unterschiedliche Positionen geben?
    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!
    @RodFromGermany
    Leider kein Erfolg.
    Ich habe auch mal probiert eine MessageBox dazwischen zupacken. Aber diese wird erst garnicht aufgerufen, weder im Designer, noch wenn ich das Programm Debugge.
    Wenn ich dir auf irgendeiner Art und Weise helfen konnte, drück doch bitte den "Hilfreich" Button :thumbup:

    Für VB.NET Entwickler: Option Strict On nicht vergessen!
    @ClonkAndre Im Designer kommt da nix.
    Wie wäre es, wenn Du die Controls in ein FlowLayoutPanel packst?
    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!
    @RodFromGermany
    Hm. Ja das wäre eine Idee, aber die Controls müssen da ja auch irgendwie erst reinkommen? Man soll die Controls halt schon im Sammlungs-Editor hinzufügen können und diese erscheinen dann im UserControl oder im FlowLayoutPanel.

    Du weißst ja ein Property besitzt ein Get und Set Abschnitt. Ok muss nicht immer aber sagen wir hier mal. Sagen wir mal die Property ist ein Boolean und wir ändern diesen in den Eigenschaften, da wird dann ja der Set Abschnitt aufgerufen. Dies passiert aber leider nicht beim Sammlungs-Editor wenn wir dort auf "OK" drücken. Der Set Abschntt der Property wird dort irgendwie nicht aufgerufen. Und das ist mein Ziel, damit ich dann da alle Controls in der Liste aufrufe und diese dann im UserControl hinzufüge.
    Wenn ich dir auf irgendeiner Art und Weise helfen konnte, drück doch bitte den "Hilfreich" Button :thumbup:

    Für VB.NET Entwickler: Option Strict On nicht vergessen!

    ClonkAndre schrieb:

    Der Set Abschntt der Property wird dort irgendwie nicht aufgerufen
    Debuggen kannman im Design-Mode nicht.
    Mach da mal ne Console-Ausgabe rein.
    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!
    @RodFromGermany
    Leider keine Ausgabe.

    Ich hab das ganze mal mit einer Property mit dem Typ Boolean ausgetestet. Dort bekomme ich im Design-Mode eine Msgbox wenn ich den Wert ändere

    VB.NET-Quellcode

    1. Private newPropertyValue As Boolean
    2. Public Property NewProperty() As Boolean ' TEST
    3. Get
    4. Return newPropertyValue
    5. End Get
    6. Set(ByVal value As Boolean)
    7. newPropertyValue = value
    8. MessageBox.Show("OK!")
    9. End Set
    10. End Property

    Wenn ich dir auf irgendeiner Art und Weise helfen konnte, drück doch bitte den "Hilfreich" Button :thumbup:

    Für VB.NET Entwickler: Option Strict On nicht vergessen!
    Aber durch das Ändern der Tiles-Property, also der List(Of Tile), wird ja die ganze Sammlung nicht neu gesetzt. Daher wird der Setter auch nicht aufgerufen. Der wird nur aufgerufen, wenn die komplette Liste durch eine andere ersetzt wird.
    Wechsel von einer List(Of Tile) zu einer Collections.ObjectModel.ObservableCollection(Of Tile) und füge z.B. dem Load-EventHandler Deines UserControls die Zeile hinzu:

    VB.NET-Quellcode

    1. AddHandler _Tiles.CollectionChanged, AddressOf UpdateList

    und dann eben noch:

    VB.NET-Quellcode

    1. Controls.Clear()
    2. For i = 0 To _Tiles.Count - 1
    3. Me.Controls.Add(_Tiles(i))
    4. _Tiles(i).Width = Me.Width
    5. _Tiles(i).Height = Me.Height \ _Tiles.Count
    6. _Tiles(i).Left = 0
    7. _Tiles(i).Top = i * Me.Height \ _Tiles.Count
    8. _Tiles(i).Visible = True
    9. Next

    (eben als Beispiel, wie es gehen kann)

    ##########

    @ClonkAndre: Update
    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.

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

    @VaporiZed
    Jo stimmt doch wie würde das dann funktionieren?

    Edit:
    @VaporiZed
    Danke für das Beispiel! Ich werde es mal versuchen.
    Wenn ich dir auf irgendeiner Art und Weise helfen konnte, drück doch bitte den "Hilfreich" Button :thumbup:

    Für VB.NET Entwickler: Option Strict On nicht vergessen!

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

    @VaporiZed
    Es funktioniert! Vielen dank :)
    Ich wusste garnicht das es solch eine Collection gibt. Die ist echt hilfreich!
    Und natürlich auch ein dankeschön an @RodFromGermany :)
    Wenn ich dir auf irgendeiner Art und Weise helfen konnte, drück doch bitte den "Hilfreich" Button :thumbup:

    Für VB.NET Entwickler: Option Strict On nicht vergessen!

    ClonkAndre schrieb:

    VB.NET-Quellcode

    1. MessageBox.Show("OK!")
    bringt im Designer nix, ersetz das durch eine Console-Ausgabe.
    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!
    @RodFromGermany
    Jo war ja nur ein kleiner Test. Aber es wurde mir trotzdem eine Messagebox angezeigt obwohl ich noch im Design-Mode war.
    Wenn ich dir auf irgendeiner Art und Weise helfen konnte, drück doch bitte den "Hilfreich" Button :thumbup:

    Für VB.NET Entwickler: Option Strict On nicht vergessen!
    not by business, but hey …

    ##########

    noch nicht komplett ausgereift, aber für den Anfang funktioniert's mit Änderung der Tiles-Property im Designer; da sind noch ein paar redunante Aufrufe drin (bei Resize und beim Setter) und beim manuellen Löschen der Panels im Designer gibbet auch noch Nachbesserungsbedarf, aber das Gewünschte ist erstmal lauffähig.

    ##########

    V2, etwas komfortabler und aufgeräumter
    Dateien
    • ObsCollection.zip

      (30,4 kB, 148 mal heruntergeladen, zuletzt: )
    • V2.zip

      (30,36 kB, 162 mal heruntergeladen, zuletzt: )
    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.

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

    Ah, ok - jo, tuts.
    Ich würde empfehlen, die Tiles-Property Readonly auszuführen:

    VB.NET-Quellcode

    1. Private ReadOnly _Tiles As New Collections.ObjectModel.ObservableCollection(Of Panel)
    2. <Browsable(True)>
    3. <Description("A collection of all Tiles")>
    4. <DesignerSerializationVisibility(DesignerSerializationVisibility.Content)>
    5. Public ReadOnly Property Tiles() As Collections.ObjectModel.ObservableCollection(Of Panel)
    6. Get
    7. Return _Tiles
    8. End Get
    9. End Property
    Das mittm Adden und Removen ist mir noch nicht ganz klar - scheinbar ist vorgesehen, auch andere Controls als Panel adden zu könnenj - wie das dann aber aussieht, habich noch nicht probiert.