HyperLink
Bejelentkezés
E-mail: 
Jelszó: 





Skip Navigation Links
 

Kinyitható property készítése


Példaprogram letöltése

13426 bájt

Egyedi komponensek, illetve kontrolok fejlesztésénél sok esetben hasznos lehet olyan property készítése, mely kinyitható és további alproperty-ket tartalmaz. A már kész kontrolok között is számos ilyet találunk, nézzünk meg például egy Font property-t, melynél szövegesen vannak megadva a tulajdonságai (Microsoft Sans Serif; 8,25pt), de ha kinyitjuk a property-t az előtte álló kis plusz jelre kattintva, akkor minden egyes tulajdonságát egyesével is állíthatjuk.
Mellékelt példában egy olyan property-t készítünk, mely képes egy magyarországi cím tárolására irányítószám, település, utca hsz. formában.

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.

Könyv
Ez a cikk megtalálható ebben a könyvben: C# Software Offline 2002 évkönyv 208. oldal

Felhasználási feltételek
A Software Online szoftverfejlesztői magazin mindegyik cikke, minden megjelent képe, és egyéb publikált anyaga szerzői jog védelme alatt áll! Bármilyen formában történő másodlagos terjesztésük, közzétételük vagy felhasználásuk kizárólag a kiadó előzetes írásbeli engedélyével történhet!

Copyright © 1999-2012 Animare Software Kft. Minden jog fenntartva!
| Készült: Animare Stúdió | Adatvédelem | Kapcsolat |