Komponente macht Probleme mit dem WindowsForms Designer

  • VB.NET
  • .NET (FX) 4.0

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

    Komponente macht Probleme mit dem WindowsForms Designer



    Jenni Jenni und Gepriesen sei Das Rauhe Haus,

    Wieder mal übelster Prolltrash. Es geht um ein Component an dem ich gerade Arbeite. Unzwar habe ich ein Array von Objecten in einer Liste die als Eigenschaft auch im Designer bearbeitet werden kann. Aber sobald ein Wert in dieser Liste gesetzt ist fangen die Probleme an. Die WindowsForm ist danach Schrott. Er kann ein Type nicht zu sich selbst Konvertieren. Ich schätze mal damit ist gemeint das ein Array nicht in eine Liste Konvertiert werden kann. Ich habe schon versucht mit dem Attribut zur Serialisierungssteuerung des Designers herum zu spielen, Fail! TypeConverter Attribut Fail. Hier mal das Problem Bildlich dargestellt.


    Und hier der Code

    Quellcode

    1. <Browsable(True)> _
    2. <Description("Stellt eine Liste von Sequencen bereit zum auslösen von Triggern bereit!")> _
    3. <DesignerSerializationVisibility(DesignerSerializationVisibility.Content)> _
    4. <TypeConverter(GetType(List(Of PTBSTriggerParameter)))> _
    5. Public Property TriggerSequence As New List(Of PTBSTriggerParameter)


    Ich hoffe wir finden eine Lösung und ich bedanke mich schon Mal von ganzen Herzen bei der Community ;)
    Bilder
    • BudallahVisualStudio2010.png

      116,43 kB, 1.920×1.033, 225 mal angesehen
    jo, Komponenten so programmieren, dass sie für den Designer brauchbar sind, ist schwierig - da muss man die Attribute richtig setzen (und überhaupt kennen), und mit vielem kommt der Designer doch nicht klar etc.
    Spontan fällt mir schoma auf, dass dein <TypConverter> gar kein TypConverter ist.
    Ich weiss aber auchnicht, welcher Converter da anzugeben ist, dasser mit deiner List(Of T) korrekt zusammenarbeitet - CollectionConverter oder sowas,
    oder vlt einfach weglassen.
    Jenni Jenni,

    Danke, ich probiere dann mal den CollectionConverter aus. Ich lese schon die ganzen Tage über wie eine Budallah die MSDN durch. Aber die komplexität des Designers ist einfach müll. Alleine der Versuch einen eigenen Designer zu implementieren ist eine Katastrophe.

    EDIT: Ok, gibt es irgendwo Beispiel Code wie ich die CollectionConverter Klasse richtig verwenden kann? Ich meine ganz ehrlich, Ich bin doch bestimmt nicht der einzige der auf die Idee gekommen ist eine Liste von Objekten als Eigenschaft zu definieren? Und der Designer kann es wohl auch Bearbeiten (er Zeigt eine entsprechende Editor Form im Visual Studio wo alles nativ aus dem Tiefen des NetFrameworks generiert wird, Happy, aber: Er generiert den Code falsch!

    LG, J Herbrich
    Hast du es denn mal ohne Converter versucht? Ich hab grad mal ein altes Projekt von mir ausgegraben bei dem es auch eine List<T> gab. Dabei habe ich kein Converter Attribute verwendet.
    Bilder
    • vb-example.png

      20,76 kB, 958×423, 38 mal angesehen
    @J.Herbrich Hat die Klasse PTBSTriggerParameter einen parameterlosen Konstruktor?
    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!
    Jenni Jenni und guten Morgen,

    Hallo, die Klasse hat gar keinen Konstruktor.

    VB.NET-Quellcode

    1. <Serializable()>
    2. Public Class PTBSTriggerParameter
    3. Public Property Sequenze As Integer
    4. Public Property Trigger1On As Boolean
    5. Public Property Trigger2On As Boolean
    6. Public Property Trigger3On As Boolean
    7. End Class


    @Fakiz der Converter kam erst später dazu in der Höffnung es würde das Problem lösen. Auch ohne Converter das gleiche Problem :(

    LG, J Herbrich

    J.Herbrich schrieb:

    Hallo
    Jenni, gib ihr versuchsweise mal einen.
    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!

    J.Herbrich schrieb:


    Unzwar habe ich ein Array von Objecten in einer Liste die als Eigenschaft auch im Designer bearbeitet werden kann

    Wenn ich das richtig verstehe dann müsste doch TriggerSequence As New List(Of PTBSTriggerParameter) eigentlich TriggerSequence As New List(Of PTBSTriggerParameter()) heißen oder?
    Jenni Jenni

    RodFromGermany schrieb:

    @J.Herbrich Hat die Klasse PTBSTriggerParameter einen parameterlosen Konstruktor?


    Habe testweise mal einen eingesetzt, Gleiches Resultat

    VB.NET-Quellcode

    1. <Serializable()>
    2. Public Class PTBSTriggerParameter
    3. Sub New()
    4. Return
    5. End Sub
    6. Public Property Sequenze As Integer
    7. Public Property Trigger1On As Boolean
    8. Public Property Trigger2On As Boolean
    9. Public Property Trigger3On As Boolean
    10. End Class


    Lg, J Herbrich
    Jenni Jenni,

    Ok, also eine IEnumerable of implementieren? Soll die auch noch ein IComponent implementieren damit der Designer damit irgendwie klar kommen kann? Ok, ich werde es mal versuchen.

    EDIT: Ok, ich habe jetzt erst Mal damit angefangen, dann kann ich ja später zur Not weitere Funktionen implementieren. Frage, soll ich noch Schnittstellen implementieren, IEnumerable oder IList, ICollection oder oder oder?

    VB.NET-Quellcode

    1. Imports System.Collections
    2. Public Class PTBSTriggerParameterCollection
    3. Inherits List(Of PTBSTriggerParameter)
    4. End Class


    EDIT2: So, ich glaube das war die Lösung. Man, der Windows Forms Designer wurde von einer richtigen Budallah bei Microsoft Entwickelt. Ok man merke, eine Generische Liste einfach in eine Proxy Klasse packen weil das System mit of oder was auch immer nicht klar kommt.

    VB.NET-Quellcode

    1. '
    2. 'JenniferHerbrichPTBSHandler1
    3. '
    4. Me.JenniferHerbrichPTBSHandler1.TriggerSequence.Add(CType(resources.GetObject("JenniferHerbrichPTBSHandler1.TriggerSequence"), Herbrich.Wilhelmstift.KJP.PTBSTriggerParameter))
    5. Me.JenniferHerbrichPTBSHandler1.TriggerSequence.Add(CType(resources.GetObject("JenniferHerbrichPTBSHandler1.TriggerSequence1"), Herbrich.Wilhelmstift.KJP.PTBSTriggerParameter))
    6. Me.JenniferHerbrichPTBSHandler1.TriggerSequence.Add(CType(resources.GetObject("JenniferHerbrichPTBSHandler1.TriggerSequence2"), Herbrich.Wilhelmstift.KJP.PTBSTriggerParameter))
    7. Me.JenniferHerbrichPTBSHandler1.TriggerSequence.Add(CType(resources.GetObject("JenniferHerbrichPTBSHandler1.TriggerSequence3"), Herbrich.Wilhelmstift.KJP.PTBSTriggerParameter))
    8. Me.JenniferHerbrichPTBSHandler1.TriggerSequence.Add(CType(resources.GetObject("JenniferHerbrichPTBSHandler1.TriggerSequence4"), Herbrich.Wilhelmstift.KJP.PTBSTriggerParameter))


    Jetzt schauen wir Mal ob der Fehler tatsächlich behoben ist oder ob es doch irgendwo harckt.

    LG, J Herbrich

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „J.Herbrich“ ()

    Jenni Jenni,

    Ja, es war wirklich verdammt Einfach, ja der Windows Forms Designer macht ein echt Krank was das denken angeht. Das Denken wird immer Komplexer was nicht gut für die Foo Baa Power ist. Auf jeden Fall bleibt jetzt die Frage wie man ein Kaputtes Windows Form wieder zum laufen bekommt. Ich habe alles aus dem Designer.vb File gelöscht aber der Designer weigert sich trotzdem die Windows Form wiederherzustellen.

    Aber ja der Tipp mit der Ableitung der Klasse ist echt Gold Wert!

    LG, J Herbrich


    PS: Danke an alle für die Lösung! Merke, niemals Direkt Generische Listen verwenden, sondern die Listen als eigene Klasse implementierten
    Jenni Jenni,

    Ok, nächstes Problem, der Inhalt der Liste wird jetzt nicht mehr von Designer gespeichert oder verschwindet regelmäßig wenn die Form geschlossen und wieder neu geöffnet wird. Selbiges auch bei einer anderen Propty die ein Enum als Typ hat.

    LG, J Herbrich

    PS: Sry für den Doppe post.
    das geht wohl mit Attribute. Ich hab hier sowas:

    VB.NET-Quellcode

    1. <TypeConverter(GetType(ExpandableObjectConverter))>
    2. <Browsable(True)>
    3. <Category("Appearance")>
    4. <Browsable(True)>
    5. <Description("some options to vary the caption-style")>
    6. <DesignerSerializationVisibility(DesignerSerializationVisibility.Content)>
    7. Public ReadOnly Property CaptionStringFormat() As StringFormat
    8. Get
    9. If MyDesignMode.True Then Invalidate(False)
    10. Return _CaptionStringFormat
    11. End Get
    12. End Property
    Die Property ist aber ein komplexes objekt - keine Liste.
    Es gibt noch mehr so Attribute, EditorBrowsableAttribute, oder System.ComponentModel.EditorAttribute, oder System.ComponentModel.Design.CollectionEditor,...