A kontrolunk a UserControl osztályból származik, azonban háromféle kontrolt tartalmaz, melyek megvalósítják a bevezetőben említett funkcionalitást.
A ComboBox-os megjelenést egy TextBox és egy, a Button osztályból származó kontrol segítségével valósítjuk meg. A nyomógomb ComboButton típusú, melyet Internal típusú osztályként deklaráltunk, elkerülendő, hogy a ToolBox palettán ez az osztály is megjelenjen (mivel ez is a kontrol névterében található, azonos assembly-ben).
A nyomógomb osztálya azért saját készítésű, hogy felüldefiniálva annak OnPaint metódusát, egyedi megjelenítést biztosíthassunk neki. Az osztály egy ButtonState típusú taggal rendelkezik, mely a nyomógomb állapotát tartalmazza.
private ButtonState state;
Az OnPaint metódusban az egyedi rajzoláshoz a Form ControlPaint osztály DrawComboButton metódusát használjuk fel, mely egy lefelé fordított nyilat rajzol a gomb felületére.
protected override void OnPaint(PaintEventArgs e)
{
base.OnPaint(e);
System.Windows.Forms.ControlPaint.DrawComboButton(e.Graphics,0,0,Width,Height,state);
}
A kontrolunk tehát tartalmaz egy ComboButton, egy TextBox és egy TreeView típusú kontrolt, melyek együtt azt a hatást keltik majd, mintha a legördülő lista fa szerkezetű lenne.
A kontrol fontos property-je a ShowedText, melyből mindig lekérdezhető a kiválasztott elem felirata, mely megjelenik a szövegmezőben.
[Browsable(false)]
public string ShowedText
{
get
{
return text;
}
set
{
text = value;
textBox1.Text = value;
}
}
Rendelkezik továbbá egy ImageList típusú property-vel is, hogy megadhassunk egy képlistát a kontrolnak. A képek a fastruktúra elemei mellett jelennek meg.
Egy elem kiválasztásának pillanatához is létrehoztunk egy eseményt, melyre a hívó alkalmazásban kezelőmetódus definiálható.
public event EventHandler SelectedItemChanged;
Az esemény akkor következik be, amikor a fa egy új csomópont kiválasztásával záródik be.
A kontrol konstruktorában kiszámoljuk a TreeView tagobjektum megjelenítési pozícióit, majd megadunk egy kezelőfüggvényt a nyomógombra történő kattintás eseményéhez, a fa egy elemének választása utáni esemény kezeléséhez és a csomópontra történő dupla kattintás eseményének kezelésére.
A csomópont kiválasztása után a SetText metódusban elvégezzük a kiválasztott csomópont feliratának elhelyezését a szövegmezőben. Amennyiben a csomópontra duplán kattintunk, a csomópont felirat a mezőbe íródik, és a TreeView fa bezáródik.
Amikor a kontrol nyomógombjára kattintunk, akkor megvizsgáljuk, hogy látható-e a fa vagy sem. Amennyiben még nem látható, akkor a SetTVPosition metódussal pozícionáljuk a megjelenést, és gondoskodunk arról, hogy a fastruktúra ne nyúljon túl a hívó alkalmazás űrlapjának méretein.
if (!treeView1.Visible)
{
SetTVPosition();
...
Parent.Controls.Add(treeView1);
...
treeView1.Visible = true;
...
A kontrol magassága 100 pixel lesz, viszont ha ezzel a mérettel kilógna az űrlapról, akkor csökkentjük ezt az értéket.
A hívó alkalmazásban egy feltöltött ImageList objektumot adunk át a kontrolnak, valamint beállítjuk a méreteit.
tvComboControl1.ImageList = imageList1;
tvComboControl1.Size = new Size(200,100);
Ugyancsak a program indulásakor felfűzünk egy gyökércsomópontot 5 gyermekcsomóponttal a faszerkezetbe.
tvComboControl1.Nodes.Add("Gyümölcsök");
tvComboControl1.Nodes[0].ImageIndex = 0;
AddNode(tvComboControl1.Nodes[0],"Alma",0);
...
Valamint létrehozunk egy kezelőmetódust a kiválasztás eseményéhez.
tvComboControl1.SelectedItemChanged += new EventHandler(tvComboControl1_SIC);
A kezelőfüggvényben a Form egy feliratán jelenítjük meg a kontrol ShowedText property-jének értékét, vagyis a kiválasztott elem feliratát.