C# - Országok listáját tartalmazó kontrol készítése

forráskód letöltése
Ha a felhasználónak egy ország nevét kell megadnia, akkor célszerű az országok listáját egy ComboBox-ban elhelyezni. Első látásra úgy tűnhet, hogy ehhez szükséges lenne egy adatbázis is az országok neveivel, valójában azonban a Windows rendszer tartalmazza ezt az információt. Az elkészítendő kontrol megvalósítja magát a ComboBox-ot, és a rendszer információit felhasználva felépíti az országok listáját.
A elkészített kontrol a UserControl osztályból származik, mely rendelkezik egy ComboBox típusú gyermekobjektummal. Ennek eredményeképpen a tagobjektumnak csak bizonyos tulajdonságait tesszük publikussá, a többit elrejthetjük.
A kontrol Countries property-je tartalmazza az országok listáját. Mivel típusa megegyezik a ComboBox kontrol Items kollekciójának típusával, azonos módon kérdezhetjük le az elemeket.
[Browsable(false)]
public ComboBox.ObjectCollection Countries
{
  get
  {
    return comboBox1.Items;
  }
}
A kiválasztott elem indexét a SelectedIndex tulajdonság hordozza.
[Browsable(false)]
public int SelectedIndex
{
  get
  {
    return comboBox1.SelectedIndex;
  }
  set
  {
    comboBox1.SelectedIndex = value;
  }
}
A Text property-vel pedig lekérdezhető a kontrolban aktuálisan megjelenő ország név.
[Browsable(false)]
public override string Text
{
  get
  {
    return comboBox1.Text;
  }      
}
Amikor a kontrolt regisztráltuk a ToolBox palettán és ezt követően egy alkalmazás Form-jára dobjuk, akkor lefut a kontrol konstruktora, melyben pedig a GetCountries metódus, összegyűjtve az országok neveit a Rendszerleíró adatbázisból.
A Registry „HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Telephony\Country List” kulcsában találjuk meg az országok adatait tartalmazó alkulcsokat. Minden ilyen kulcson belül van egy Name nevű érték, amely az ország nevét tartalmazza.
A metódusban először megnyitjuk a HKEY_LOCAL_MACHINE főkulcsot.
private void GetCountries()
{
  RegistryKey key = RegistryKey.OpenRemoteBaseKey(RegistryHive.LocalMachine, "");
Megnyitjuk a „Country List” alkulcsot, majd létrehozunk egy további kulcsot az albejegyzések feldolgozásához.
  RegistryKey subkey = key.OpenSubKey("Software\\Microsoft\\Windows\\CurrentVersion\\Telephony\\Country List");
  RegistryKey countrykey;
Lekérdezzük az országok adatait tartalmazó alkulcsok neveit egy karakterlánc-tömbbe.
  string[] countrykeynames = subkey.GetSubKeyNames();
Majd ezeket a neveket felhasználva sorban megnyitjuk a kulcsokat, és kiolvassuk a „Name” kulcs alatti értéket, mely egy ország név lesz.
  for(int i=0;i<subkey.SubKeyCount;i++)
  {
    countrykey = subkey.OpenSubKey(countrykeynames[i]);
A neveket eltároljuk a ComboBox tagkontrolban.
    comboBox1.Items.Add(countrykey.GetValue("Name"));                    
  }
  subkey.Close();
}
A kiválasztott elem megváltozásának eseményéhez létrehoztunk egy kezelőt a ComboBox kontrol számára, melyben elsütjük a szülő kontrol deklarált eseményét. Az esemény deklarációja a következő:
public delegate void SIHandler(object sender, EventArgs e);
public event SIHandler SelectedItemChanged;
A tagobjektum kezelője - melyben az eseményt példányosítjuk - a következőképpen fest:
private void comboBox1_SIChange(object sender,EventArgs e)
{
  SelectedItemChanged(this,e);      
}
A hívó alkalmazásban a Form-ra dobott kontrol SelectedItemChanged eseményéhez deklaráltunk egy kezelőt.
this.ceControl1.SelectedItemChanged += new CELibrary.CEControl.SIHandler(ceControl1_SIChanged);
A kezelőfüggvény definíciójában pedig egyszerűen csak kiolvassuk a Text property értékét.
private void ceControl1_SIChanged(object sender,EventArgs e)
{
  textBox1.Text = ceControl1.Text;
}
A kontrol alapértelmezésben Magyarország nevét jeleníti meg a ComboBox-ban.