none
PropertyGrid Generic List with Generic Items RRS feed

  • Frage

  • Is there a way to display and edit values in the PropertyGrid (and his CollectionEditor) of an object, which is derived from an abstract generic class?
    I don't get the properties displayed only something like this: "IFilter´1" or "BaseFilter'1" Where IFilter is an Interface, and BaseFilter an abstract class.

    All objects contained by this list:
    List<IFilter<bool
    >> _activeFilter = new
     List<IFilter<bool
    >>();


    There is one abstract class, implementing the IFilter<T>
    public abstract class FilterBase<T> : IFilter<T> { ... }

    And a few specialized implementations of the FilterBase<T>
    public
    
     class
    
     SimpleBool : FilterBase<bool
    > {

    public bool BoolValue { get ; set ; }

    protected override bool Process(bool input) {
    return input && BoolValue;
    }
    }


    When I add such a "SimpleBool" class to the above defined list, the PropertyGrid wont display any of the Properties.  But it displays all correct when I define an Generic List with a non generic Type.

    Is there an Solution to get this work? I tryed to add some TypeConverter and an own CollectionEditor. Obviously without luck =(

    opps, grad erst gesehn das es ein Deutsches Forum ist =)
    • Bearbeitet chriszero_d Dienstag, 2. Februar 2010 15:39 Formatting
    Dienstag, 2. Februar 2010 15:38

Antworten

  • Hallo,
    Ich habe ne Lösung für das Problem gefunden. Hier der Code zum reproduzieren plus die Lösung. Wobei ich eher denke das das ein Bug im Propertygrid ist.

    using System;
    using System.Collections.Generic;
    
    namespace GenericTest {
    
        public class Listholder {
            private List<IFilter<bool>> _list = new List<IFilter<bool>>();
            public List<IFilter<bool>> List {
                get { return _list; }
                private set { _list = value; }
            }
    
            public Listholder() {
                List.Add(new SimpleBool());
                List.Add(new SimpleBool());
            }
        }
    
        public interface IFilter<T> {
            T Process(T input);
            // Kommentar Entfernen für lösung
            //string Foo { get; set; }
        }
    
        public abstract class FilterBase<T> : IFilter<T>{
            public virtual T Process(T input) {
                // impl
                return input;
            }
            // Kommentar Entfernen für lösung
            //public string Foo {get;set; }
        }
    
        public class SimpleBool : FilterBase<bool> {
    
            public bool Val { get; set; }
    
            public override bool Process(bool input) {
                return base.Process(input);
            }
        }
    }


    ProperyGrid.SelectedObject setzen mit propertyGrid1.SelectedObject = new Listholder();
    Dieses Beispiel reproduziert den Fehler. Wenn die Kommtarte bei "string Foo {get;set;}" bei Interface und Abstrakter Klasse entfernt werden funktioniert es.
    • Als Antwort markiert chriszero_d Dienstag, 9. Februar 2010 10:49
    Sonntag, 7. Februar 2010 13:51

Alle Antworten

  • Ich kann dein Problem nicht reproduzieren. Hier meine Demo mit VB9:

    Public Class Form1
    
      Private pg As New PropertyGrid With {.Dock = DockStyle.Fill}
      Private l As New List(Of SimpleBool)
    
      Private Sub Form1_Load(ByVal sender As System.Object, _
                             ByVal e As System.EventArgs) _
                             Handles MyBase.Load
        Me.Controls.AddRange(New Control() {pg})
        l.Add(New SimpleBool With {.p0 = True})
        l.Add(New SimpleBool With {.p0 = False})
        'pg.SelectedObject = l(0)
        pg.SelectedObjects = l.ToArray
      End Sub
    
    End Class
    
    Interface IFilter(Of T)
      Property p0() As T
    End Interface
    
    Public MustInherit Class FilterBase(Of T)
      Implements IFilter(Of T)
    
      Public MustOverride Property p0() As T Implements IFilter(Of T).p0
    
    End Class
    
    Public Class SimpleBool
      Inherits FilterBase(Of Boolean)
    
      Private _p0 As Boolean = False
      Public Overrides Property p0() As Boolean
        Get
          Return Me._p0
        End Get
        Set(ByVal value As Boolean)
          Me._p0 = value
        End Set
      End Property
    
    End Class
    --
    Peter
    Samstag, 6. Februar 2010 19:15
  • Hallo,
    Ich habe ne Lösung für das Problem gefunden. Hier der Code zum reproduzieren plus die Lösung. Wobei ich eher denke das das ein Bug im Propertygrid ist.

    using System;
    using System.Collections.Generic;
    
    namespace GenericTest {
    
        public class Listholder {
            private List<IFilter<bool>> _list = new List<IFilter<bool>>();
            public List<IFilter<bool>> List {
                get { return _list; }
                private set { _list = value; }
            }
    
            public Listholder() {
                List.Add(new SimpleBool());
                List.Add(new SimpleBool());
            }
        }
    
        public interface IFilter<T> {
            T Process(T input);
            // Kommentar Entfernen für lösung
            //string Foo { get; set; }
        }
    
        public abstract class FilterBase<T> : IFilter<T>{
            public virtual T Process(T input) {
                // impl
                return input;
            }
            // Kommentar Entfernen für lösung
            //public string Foo {get;set; }
        }
    
        public class SimpleBool : FilterBase<bool> {
    
            public bool Val { get; set; }
    
            public override bool Process(bool input) {
                return base.Process(input);
            }
        }
    }


    ProperyGrid.SelectedObject setzen mit propertyGrid1.SelectedObject = new Listholder();
    Dieses Beispiel reproduziert den Fehler. Wenn die Kommtarte bei "string Foo {get;set;}" bei Interface und Abstrakter Klasse entfernt werden funktioniert es.
    • Als Antwort markiert chriszero_d Dienstag, 9. Februar 2010 10:49
    Sonntag, 7. Februar 2010 13:51
  • Jetzt ist es klar. Ich habe da auch keine Idee.

    --
    Peter
    Dienstag, 9. Februar 2010 08:02