A feladat adott, nézzük a megvalósítás lépéseit.
Először is készítsük el az új kontrolt, mely tartalmazza az új property-t.
Új kontrol: ExpandablePropertyControlLibrary projekt
Készítünk először is egy Address nevű osztályt, mely három property-t fog tartalmazni, melyek tárolják a település, irányítószám, valamint az utca, hsz. adatokat. Mindegyik property-hez tartozik egy-egy változó, mely a tényleges adattárolást végzi el. Minden property egyszerűen visszaadja e változó értékét, illetve eltárolja benne az új értéket. Eddig tehát az Address egy igen egyszerű osztálynak tekinthető.
public class Address
{
public string City
{
get { return city; }
set { city = value; }
}
Az Address osztályban felülírjuk a ToString függvényt, melyben e három változó értékét adjuk vissza egyetlen sztringben. Erre a későbbiek folyamán lesz majd szükségünk.
public override string ToString()
{
return postalCode.ToString() + " " + city + ", " + street;
}
Ahhoz, hogy a Properties ablakban az Address osztály típusú property kinyitható, becsukható legyen szükségünk lesz egy speciális konverter osztály felhasználására, melynek az lesz a feladata, hogy egy sztringként megadott címzést konvertálni tudjon Address osztály formátumra, illetve egy Address osztályt sztringgé. Ehhez készítünk egy AddressConverter nevű osztályt, melyet úgy tudunk az Address-hez rendelni, hogy egy TypeConverter attribútumba megadjuk ezt.
[TypeConverter(typeof(AddressConverter))]
public class Address
{
...
Készítsük most el az AddressConverter osztályt, mely az ExpandableObjectConverter-ből kell hogy származzon.
internal class AddressConverter: ExpandableObjectConverter
{
...
Ebben három függvényt kell felülírnunk: CanConvertFrom, ConvertFrom és a ConvertTo. Az elsőben azt kell megvizsgálnunk, hogy tudunk-e majd konvertálni a rendelkezésre álló adatból egy Address típusú objektumot.
A ConvertFrom akkor kerül meghívásra, amikor egy sztringből kell Address típust előállítanunk. Erre akkor kerül sor, ha a Properties ablakban közvetlenül az Address property-hez írjuk be a címet és ezt fel kell bontani három értékre: irányítószám, település és utca, hsz.
public override object ConvertFrom(ITypeDescriptorContext context, CultureInfo info, object value)
...
Ezt a szöveget a függvény value paraméterében kapjuk meg és a létrehozott Address-t a visszatérési értékként kell megadnunk.
A felbontást úgy végezzük el, hogy az egyes mezők közé került szóköz alapján felbontjuk a sztringet, majd sorba adjuk az értékeket az egyes mezőknek.
A ConvertTo nevű függvénynél egyszerűbb a helyzet: itt a kapott value paraméter egy Address objektumot takar, melyet sztringgé kell alakítanunk és ezt a függvény visszatérési értékének adni.
public override object ConvertTo(ITypeDescriptorContext context, CultureInfo culture, object value, Type destType)
...
Mivel az Address-ben felülírtuk a ToString függvényt, mely előállítja számunkra az itt szükséges sztringet, így most nincs más dolgunk, mint ezt felhasználni.
A ConvertTo akkor kerül meghívásra, ha a Properties ablakban az Address property valamely alproperty-je változik és szükségessé válik az Address frissítése, vagyis elő kell állítani a szükséges sztringet.
Most, hogy adott az Address osztály és szükséges konvertáló osztály is, rátérhetünk a UserControl1 kontrol fejlesztésére is, melyben nincs más teendőnk, mint létrehozni egy Address típusú property-t:
[Category("Address data")]
public Address Address
{
get { return addrees; }
set { addrees = value; }
}
Ettől kezdve a kontrolt tartalmazó DLL fordítható és felhasználható.
Teszt alkalmazás: ExpandableProperty projekt
A kontrol fordítása után vegyük fel a ToolBox-ra azt, majd helyezzünk egyet a Form-ra belőle. Ha mindent jól készítettünk el, akkor a Properties ablakban láthatóvá válik az új kontrolban egy Address nevű property, mely kinyitható és három alproperty-t tartalmaz.
Ha most változtatjuk a PostalCode, City és Street property-k valamelyikét, akkor automatikusan változnia kell az Address property-nek is. Ennek visszafelé is működnie kell: ha változtatjuk az Address property-nél lévő sztringet, akkor az előbbi három property-nek kell felvennie az új értékeket. Ügyeljünk arra, hogy a sztringként megadott cím csak az alábbi formában helyes:
[irányítószám] [település], [utca hsz.]
Például:
7400 Kaposvár, Rőzse u. 12.