Listen bzw Arrays im eigenem Control

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

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

    Listen bzw Arrays im eigenem Control

    Hallola,

    ich hab mal eine Kurze Frage! ;D

    Wie benutze ich richtig, Listen bzw Arrays im eigenem Control mit eigenem Objekten bzw. was müsste ich alles beachten?

    Spoiler anzeigen

    C#-Quellcode

    1. public List<Auto> Autos { get; set; }


    MfG Facebamm
    Custom Tab Controller

    Wollte Panels als Body nehmen und Custom Buttons als Tab Controller.
    Dann noch ein Treeview mit dem Struct
    Verwendung die nicht geht!!
    Spoiler anzeigen

    C#-Quellcode

    1. private List<TreeItem> _Items;
    2. [DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
    3. public List<TreeItem> Items {
    4. get => _Items;
    5. private set {
    6. if (value == _Items)
    7. return;
    8. _Items = value;
    9. foreach (TreeItem item in _Items) {
    10. item.PropertyChanged += Invalidate;
    11. }
    12. Invalidate();
    13. }
    14. }


    TreeItem
    Spoiler anzeigen

    C#-Quellcode

    1. [Serializable]
    2. public class TreeItem {
    3. public event Action PropertyChanged;
    4. #region Properties
    5. private Color? _Backgroud;
    6. public Color? Background { get => _Backgroud; set => PropertyUpdate(ref _Backgroud, value, PropertyChanged); }
    7. private Color? _Foreground;
    8. public Color? Foreground { get => _Foreground; set => PropertyUpdate(ref _Foreground, value, PropertyChanged); }
    9. private Padding _Padding;
    10. public Padding Padding { get => _Padding; set => PropertyUpdate(ref _Padding, value, PropertyChanged); }
    11. private string _Title;
    12. public string Title { get => _Title; set => PropertyUpdate(ref _Title, value, PropertyChanged); }
    13. private List<TreeItem> _SubItems;
    14. [DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
    15. public List<TreeItem> SubItems { get => _SubItems; set {
    16. value.ForEach(item => item.PropertyChanged += PropertyChanged);
    17. PropertyUpdate(ref _SubItems, value, PropertyChanged);
    18. }
    19. }
    20. private bool _IsOpen;
    21. public bool IsOpen { get => _IsOpen; set => PropertyUpdate(ref _IsOpen, value, PropertyChanged); }
    22. #endregion
    23. public TreeItem() {
    24. SubItems = new List<TreeItem>();
    25. IsOpen = false;
    26. Padding = new Padding(3);
    27. Foreground = Color.Red;
    28. }
    29. public TreeItem(string title) : this() {
    30. Title = title;
    31. }
    32. public TreeItem(string title, params TreeItem[] subitems) : this(title) {
    33. SubItems.AddRange(SubItems);
    34. }
    35. public TreeItem(string title, params string[] subitems) : this(title, subitems.Select(item => new TreeItem(item)).ToArray()) { }
    36. public TreeItem(params string[] items) : this(items[0], items.Skip(0).ToArray()) { }
    37. public TreeItem(params TreeItem[] item) : this(item[0].Title, item.Skip(1).ToArray()) { }
    38. public void PropertyUpdate<T>(ref T field, T value, Action action) {
    39. if (!Equals(field, value)) {
    40. field = value;
    41. }
    42. action?.Invoke();
    43. }
    44. }

    Facebamm schrieb:

    Dann noch ein Treeview mit dem Struct
    Verwendung die nicht geht!!
    Bitte was?
    Und was geht nicht?

    Könntest du bitte, in ganzen Sätzen und ohne Code, uns hier schreiben, was dein Control können soll, was es gerade tut (oder auch nicht) und was genau nun der Fehler ist?
    Mit augenscheinlichem WPF Code und der Meldung "Geht nicht" kann ich leider wenig anfangen.
    @EaranMaleasi natürlich gern

    Was ist ein TreeView oder Treeview
    Bild

    Das Control ist dann ein WinFrom Control.

    Was soll es können, genau das gleiche wie ein TreeView/Treeview.

    Wie hatte ich es geplant, ich dachte mir ich hab ein Mutter-Control in dem eine Liste aller Kinder Liegen und jedes Kind hat selbst nochmal eine Liste mit seinen Kinder.
    Und wen ich nun ein Kind Object vom Mutter-Object öffne, dann sehe ich die Kinder :D

    Tipp: Unten gibt es Tags und dort erkennt man auch das es WinForm ist und nix WPF :P
    @Facebamm Was sollen denn die TreeItems beim Invalidisieren updaten?
    Was für eine Action wird da aufgerufen?
    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!
    public string Title { get => _Title; set => PropertyUpdate(ref _Title, value, PropertyChanged); }
    public void PropertyUpdate<T>(ref T field, T value, Action action) { .. }
    public event Action PropertyChanged;

    ​item.PropertyChanged += Invalidate;

    Und das event sorgt dafür das es im Mutter-Object neu gezeichnet wird, danke für den einwand ...
    ich fühle mich gerade Verarscht von VS ... Es ist abgestürzt und jetzt geht es.

    Mein hauptproblem war/ist das immer wenn ich ein Kind hinzugefügt habe, das es nicht Aktualisiert wurde bzw. neu Gezeichnet
    @Facebamm Jou, deswegen wunderte ich mich, ich hab auch einen TreeView mit Makro-Items und dessen Properties werden fein säuberlich angezeigt bei Änderung, ohne ein eigenes Invalidisieren.
    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
    Regelst du so, das du immer neue Controls reinpackst oder zeichnest du alles?

    Also

    C#-Quellcode

    1. -TreeView [Control]
    2. -| Item [Control]
    3. -| Item [Control]
    4. -| Item [Control]
    5. -| Item [Control]


    oder sagst du, das es Nur ein Control gibt und Zeichnest den Rest?

    denn mein Ansatz war, das ich alles zeichne ;D
    Spoiler anzeigen

    C#-Quellcode

    1. Graphics graphics = e.Graphics;
    2. int yPos = 2;
    3. if (Items == null)
    4. return;
    5. Items.ForI<TreeItem, int>((item, i) => {
    6. Size size = TextRenderer.MeasureText(item.Title, Font);
    7. TextRenderer.DrawText(
    8. graphics,
    9. item.Title,
    10. Font,
    11. new Point(2 + item.Padding.Left, yPos + item.Padding.Top),
    12. item.Foreground.HasValue ? item.Foreground.Value : ForeColor);
    13. yPos += size.Height + item.Padding.Bottom;
    14. });
    15. ....
    16. public static void ForI<TSource, TOut>(this IList<TSource> source, Action<TSource, int> action) {
    17. if (source == null) {
    18. return;
    19. }
    20. for (int i = 0, count = source.Count; i < count; i++) {
    21. action(source[i], i);
    22. }
    23. }
    @Facebamm Bei mir kommt ein Icon und ein Text vor, das malt sich "von selbst".
    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!
    @Facebamm Nö, ein TreeViewItem.
    Ist das bei Dir anders?
    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!
    also nach post#3 siehts nicht so aus.
    Mein tipp @Facebamm: Lass es. Versuch nicht das Rad neu zu erfinden, schon garnet sowas komplexes wie ein Treeview-Control.
    allein auf Mausklick an der richtigen Stelle zu reagieren und entsprechend ein TreeItem auf Selected setzen (inklusive Neuzeichnung), auch in Verbindung mit einem Versatz, wenn das Control gescrollt ist - scheint mir irrsinnig anspruchsvoll - und da habich noch nichtmal an auf- und zu-klappen von TreeItems gedacht, oder ans editieren.