C# - Saját kontrolhoz, komponenshez kollekció property készítése

forráskód letöltése
Készítünk egy olyan kontrolt, melynél egy olyan property-t hozunk létre, ami egy kollekciót képes tárolni. A kollekció egy-egy eleme egy általunk megadott tetszőleges típusú osztály lehet. A kollekcióba a program szerkesztési ideje alatt tetszőleges számú elemet felvehetünk.
A CollectionControlLibrary projekt lefordítása után a ToolBox-ra felvehető egy CollectionComponent nevű komponens. Ennek Group property-je lesz a kollekció tároló property.
A komponens elkészítéséhez három osztályt kell létrehozni. Az első lesz a kollekció elemeit leíró osztály, a második a property osztálya mely nem más, mint maga a kollekció, végül a harmadik a komponens osztálya lesz.
A Group osztály
Ez az osztály fogja tárolni a kollekció egy-egy elemének adatait. Az egyszerűség kedvéért csak két property-t tartalmaz, az egyik a Caption, másik a Value nevet kapja. Az osztály adattároláson kívül más funkciót nem végez.
A kollekcióban megadott adatok tárolásának érdekében meg kell adnunk a Serializable attribútumot az osztályhoz.
  [Serializable()]
  public class Group
  {
    public string Caption
    {
      get
      {
        return caption;
      }
      set
      {
        caption = value;
      }
    }
    public int Value
    {
      get
      {
        return this.value;
      }
      set 
      {
        this.value= value;
      }
    }
  }
A Groups osztály
Ebben az osztályban hozzuk létre a kollekciót, így ennek a CollectionBase osztályból kell származnia. Ennek szintén meg kell adnunk a Serializable attribútumot. Ezt követően implementálnunk kell az ősosztályban lévő függvényeket.
  [Serializable()]
  public class Groups: System.Collections.CollectionBase
  {
Az Add függvény akkor kerül meghívásra, amikor a kollekcióhoz új elem kerül hozzáadásra. A függvény paramétereként egy Group osztály példányát kapjuk. Az adat tárolását a CollectionBase ősosztályban lévő List property-ben tehetjük meg.
    public void Add(Group value)
    {
      List.Add(value);      
    }
A Contains függvény arra szolgál hogy ellenőrizhessük, hogy a paraméterként megadott Group osztály példánya szerepel-e már a kollekcióban, ez esetben a visszatérési értéke igaz lesz.
    public bool Contains(Group value) 
    {
      return List.Contains(value);
    }
A CopyTo függvénnyel több elemet adhatunk egy lépésben a kollekcióhoz. Első paraméterként egy tömböt kell átadnunk, melynek minden eleme Group típusú. Második paraméterként azt határozhatjuk meg, hogy e tömb hányadik elemétől kezdődjön a másolás.
    public void CopyTo(Group[] array, int index) 
    {
      List.CopyTo(array, index);
    }
Az IndexOf függvény felhasználásával a paraméterként megadott Group osztályt kereshetjük meg a kollekcióban. Visszatérési értékként az elem sorszámát kapjuk meg, amennyiben volt találat, illetve -1-et, amennyiben nem.
    public int IndexOf(Group value) 
    {
      return List.IndexOf(value);
    }
Az Insert függvénnyel egy új elemet szúrhatunk be a kollekció egy megadott pozíciójára. Első paraméterként a beszúrás pozícióját adhatjuk meg, másodikként az új elemet.
    public void Insert(int index, Group value) 
    {
      List.Insert(index, value);
    }
A Remove függvénnyel távolíthatjuk el a kollekció egy elemét, melyet paraméterként kell átadni Group típusban.
    public void Remove(Group value) 
    {
      List.Remove(value);
    }
Elkészítjük a kollekcióhoz tartozó property-t is, melyen keresztül elérhetővé válnak annak egyes elemei.
    public Group this[int index]
    {      
      get 
      { 
        if(index >= Count || index < 0)
        {
          return null;
        }
        else
        {
          return (Group) List[index];
        }
      }
      set
      {
        List[index] = value;
      }
    }
  }
A CollectionComponent komponens
Végül már csak az a feladatunk maradt hátra, hogy elkészítsük azt a komponenst, melyben létrehozzuk a kollekció típusú property-t. Első lépésként létrehozzuk a Groups osztály egy példányát, ez lesz az alapja a kollekció property-nek.
    private Groups groups = new Groups();
A property létrehozásánál meg kell adnunk a DesignerSerializationVisibility attribútumot annak érdekében, hogy a kollekcióba felvett elemek adatai tárolásra kerüljenek. Ennek hiányában a szerkesztési időben megadott adatok nem kerülnének tárolásra.
    [DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
    public Groups Groups
    {
      get
      {
        return groups;
      }
    }
A komponens felhasználása
Miután a komponenst feltöltöttük adatokkal, annak elemeit egy ciklus segítségével elérhetjük a program futási ideje alatt.
      for (int i=0; i<collectionComponent1.Groups.Count; i++)
      {
        listBox1.Items.Add(collectionComponent1.Groups[i].Caption + " - " + collectionComponent1.Groups[i].Value.ToString());
      }