1. Liebe Forumsgemeinde,

    aufgrund der Bestimmungen, die sich aus der DSGVO ergeben, müssten umfangreiche Anpassungen am Forum vorgenommen werden, die sich für uns nicht wirtschaftlich abbilden lassen. Daher haben wir uns entschlossen, das Forum in seiner aktuellen Form zu archivieren und online bereit zu stellen, jedoch keine Neuanmeldungen oder neuen Kommentare mehr zuzulassen. So ist sichergestellt, dass das gesammelte Wissen nicht verloren geht, und wir die Seite dennoch DSGVO-konform zur Verfügung stellen können.
    Dies wird in den nächsten Tagen umgesetzt.

    Ich danke allen, die sich in den letzten Jahren für Hilfesuchende und auch für das Forum selbst engagiert haben. Ich bin weiterhin für euch erreichbar unter tti(bei)pcwelt.de.
    Dismiss Notice

C# List<...> im Visual Studio Designer

Discussion in 'Programmieren' started by tetrododoxin, Sep 22, 2008.

Thread Status:
Not open for further replies.
  1. tetrododoxin

    tetrododoxin Kbyte

    Hola allerseits,

    Es geht um C#, .Net2.0, VS 2005

    ich habe eine Klasse, die von ComboBox abgeleitet ist. Die ObjectsCollection "Items" wird ja mit einem String Editor im Designer angezeigt, die man dann bearbeiten kann. Wenn ich nun eine List<Int32> oder List<Boolean> in die Klasse packe, kann ich die mir im Designer zwar sogar ansehen und Werte einfügen, jedoch werden diese im Designer-Code nicht eingefügt, sprich, nicht erzeugt.
    Wenn ich das ganze mit Boolean[] oder Int32[] Arrays versuche, klappt es wiederum.
    Weiß jemand, mit welcher Interface Implementierung oder welchem Attribut ich den VS Designer dazu bekomme, Werte für die generischen Listen zu erzeugen?

    Danke!
     
  2. tetrododoxin

    tetrododoxin Kbyte

    Also, ich habe inzwischen selbst etwas herausgefunden. Mit generischen Listen klappt es offenbar mit Hausmitteln nicht. VS2005 verwendet für Arrays jedoch einen eigenen Designer, der sich der Einfachheit halber auch ArrayEditor nennt und in System.ComponentModel.Design zu finden ist.

    Der Knackpunkt für mich war, aus List<iComboBoxItem> eine eigene Collection zu definieren:



    Code:
    // kapselt eine List<iComboBoxItem>
    public class iComboBoxItemCollection : IList, ICollection, IEnumerable
    {...}

    Die entsprechenden Eigenschaften und Methoden der Interfaces sind schnell implementiert.
    Nun braucht man für diese Collection einen eigenen Designer, der sich vom Standard CollectionEditor ableitet:


    Code:
    public class iComboItemCollectionEditor : 
              System.ComponentModel.Design.CollectionEditor
    {
        public iComboItemCollectionEditor(Type type)
            : base(type)
        {
        }
    
        protected override bool CanSelectMultipleInstances()
        {
            return false;
        }
    
        protected override Type CreateCollectionItemType()
        {
            return Type.GetType("Interlook.Utils.iComboBoxItem");
        }
    
        protected override object[] GetItems(object editValue)
        {
            if (editValue is iComboBoxItemCollection)
            {
                iComboBoxItemCollection source = 
                  (iComboBoxItemCollection)editValue;
                object[] result = new object[source.Count];
                for (int i = 0; i < source.Count; i++)
                    result[i] = source[i];
                return result;
            }
            return new object[0];
        }
    
        protected override object SetItems(object editValue, object[] value)
        {
            if (!(editValue is iComboBoxItemCollection) && (editValue != null))
            {
                return editValue;
            }
            iComboBoxItemCollection destination = new iComboBoxItemCollection();
    
            foreach (object o in value)
            {
                if (o is iComboBoxItem)
                {
                    destination.Add((iComboBoxItem)o);
                }
            }
            return destination;
        }
    
        protected override string GetDisplayText(object value)
        {
            if(!(value is iComboBoxItem))
                return "none";
            iComboBoxItem source = (iComboBoxItem)value;
    
            String result = 
      ((source.Text!=null) && (source.Text.Length > 0)) ? source.Text : "leer";
    
            return result;
        }
    }
    
    Man muss dabei einen Verweis auf die System.Design.dll zum Projekt hinzufügen.
    Jetzt ist nur noch wichtig, dass man die iComboBoxItemCollection Klasse (s.o.) mit folgendem Attribut definiert:

    Code:
    [EditorAttribute(typeof(Interlook.Utils.iComboItemCollectionEditor),
     typeof(System.Drawing.Design.UITypeEditor))]
    
    Dann klappt es im Designer. Vielleicht hilft das ja jemandem, der mal ein ähnliches Problem haben sollte
     
    Last edited: Sep 23, 2008
  3. georg5555

    georg5555 ROM

    Moin,

    wie hast du iComboxItemCollection implementiert? Es sind ja nicht gerade wenige Methoden, die von den Interfaces verlangt werden.
     
Thread Status:
Not open for further replies.

Share This Page