Steuerelemente zum Editieren von bestimmten Objekten (zur Laufzeit)

  • C#
  • .NET (FX) 4.5–4.8

Es gibt 8 Antworten in diesem Thema. Der letzte Beitrag () ist von TRiViUM.

    Steuerelemente zum Editieren von bestimmten Objekten (zur Laufzeit)

    Guten Morgen werte Community,

    ich habe eine eigene Klasse erstellt, welche folgende Datentypen als Eigenschaften besitzt:
    String
    Dictionary<string,string> (genauer gesagt ein SerializableDictionary<string,string>, siehe stackoverflow.com/questions/12…erializing-net-dictionary)
    Enum

    Anschließend habe ich dann eine Liste von diesem Objekt angelegt.

    Diese Liste soll dann zur Laufzeit vom Bediener editierbar sein.

    Da das Datagridview ziemlich mächtig ist, ich mich aber mit dem DataBinding nicht sonderlich auskenne, ist das vermutlich auch der Grund dafür, weshalb ich damit keine zufriedenstellende Ergebnisse bekommen habe.
    Zudem man eine Dictionary<string,string> auch schlecht in eine Zelle packen kann.
    Dazu habe ich mir dann noch gedacht, ich könnte dafür eine Button-Spalte anlegen und Sobald man auf einen Button klickt, geht ein weiteres Fenster zum Editieren der Dictionary<string,string> auf.

    Soweit, so gut. aber gibt es ein Steuerelement, was das kann?

    Für das Bearbeiten einer Enumeration habe ich bereits ein Steuerelement gefunden (Universal enum Editor).

    Gib es evtl. eine Art Übersicht aller Steuerelemente, die zum Editieren bestimmter Datentypen geeignet sind?
    Sowas wie z.B. String -> Textbox ?

    Ich hatte sonst noch überlegt, ob es eine Möglichkeit gibt, die UiEditoren (die Editoren, die sich öffnen, wenn man im Designer Eigenschaften ändert) als Control auf ein Dialog zu platzieren.

    Besten Dank für Anrworten :saint:

    Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von „TRiViUM“ ()

    Danke für Deinen Vorschlag :thumbup:
    In der Zwischenzeit hatte ich das allerdings auch schon ausprobiert und wenn ich eine List<EigeneKlasse> zuweise, komme ich schon gar nicht mehr an die einzelnen Elemente heran:


    Das PropertyGrid bietet ja neben der Eigenschaft SelectedObject noch die Eigenschaft SelectedObjects an.
    Wenn ich diese dann mit meiner List<>.ToArray() beschreibe, sehe ich im PropertyGrid allerdings nur das erste Element :(
    Ich dachte da eher an z.B. eine ListBox in der die Klasseninstanzen gelistet sind und bei Auswahl wird diese dem PropertyGrid übergeben. Habs aber nicht selbst versucht.

    *EDIT*
    Also bei mir funktioniert das soweit ganz gut.

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

    TRiViUM schrieb:

    komme ich schon gar nicht mehr an die einzelnen Elemente heran:
    Das müssen alles Public Properties sein.
    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 schrieb:

    Public Properties

    Danke für den Hinweis, sind sie allerdings tatsächlich schon.
    Bis auf die Liste selbst, das ist (momentan) eine lokale Variable.

    @ErfinderDesRades
    Jo, dachte nur, es wäre für den Lösungsansatz eher uninteressant.
    Hier meine Klasse:

    Spoiler anzeigen

    C#-Quellcode

    1. using System;
    2. namespace WTMessage.Core
    3. {
    4. [Serializable]
    5. /// <summary>
    6. /// Die Basisklasse für EDTest-Meldungen.
    7. /// </summary>
    8. public class Message
    9. {
    10. #region Konstruktor
    11. /// <summary>
    12. /// Erzeugt eine neue Meldung.
    13. /// </summary>
    14. public Message()
    15. {
    16. ID = "";
    17. Text = new SerializableDictionary<string, string>();
    18. Action = MessageAction.None;
    19. ResetMode = Mode.None;
    20. }
    21. /// <summary>
    22. /// Erzeugt eine neue Meldung.
    23. /// </summary>
    24. /// <param name="id">Die ID, welche der Meldung zugeteilt werden soll.</param>
    25. /// <param name="text">Das Wörterbuch mit den Anzeigetexten.</param>
    26. /// <param name="action">Die Aktionen, die die Meldung auslösen soll.</param>
    27. public Message(string id, SerializableDictionary<string, string> text, MessageAction action, Mode resetMode)
    28. {
    29. ID = id;
    30. Text = text;
    31. Action = action;
    32. ResetMode = resetMode;
    33. }
    34. #endregion
    35. #region Eigenschaften
    36. /// <summary>
    37. /// Ruft die ID ab, die der Meldung zugeordnet ist, oder legt diese fest.
    38. /// </summary>
    39. public string ID { get; set; }
    40. /// <summary>
    41. /// Ruft das Wörterbuch mit den anzuzeigenden Texten in unterschiedlichen Sprachen ab, oder legt dieses fest.
    42. /// </summary>
    43. public SerializableDictionary<string, string> Text { get; set; }
    44. /// <summary>
    45. /// Ruft ab, wie diese Meldung zu behandeln ist, oder legt dies fest.
    46. /// </summary>
    47. public MessageAction Action { get; set; }
    48. /// <summary>
    49. /// Ruft die Betriebsart ab, in der die Meldung zurückgesetzt werden kann, oder legt dies fest.
    50. /// Dies hat nur Auswirkungen auf Meldungen, dessen Action das Flag SysStop besitzt.
    51. /// </summary>
    52. public Mode ResetMode { get; set; }
    53. #endregion
    54. }
    55. }


    Und die Enumerationen:
    Spoiler anzeigen

    C#-Quellcode

    1. using System;
    2. namespace WTMessage.Core
    3. {
    4. [Flags]
    5. public enum Mode
    6. {
    7. None = 0,
    8. Test = 1,
    9. Setup = 2,
    10. Diagnosis = 4,
    11. Development = 8,
    12. }
    13. }


    C#-Quellcode

    1. using System;
    2. namespace WTMessage.Core
    3. {
    4. [Flags]
    5. public enum MessageAction
    6. {
    7. None = 0,
    8. Email1 = 1,
    9. Email2 = 2,
    10. Email3 = 4,
    11. SysStop = 8,
    12. }
    13. }


    Fakiz schrieb:

    Also bei mir funktioniert das soweit ganz gut

    Achso, das habe ich noch gar nicht überlegt. Wäre evtl. ein Ansatz, allerdings kann ich z.B. eine Dictionary nicht über das PropertyGrid erweitern.

    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „TRiViUM“ ()