Diskuze: c# form - generování komponent v kódu
V předchozím kvízu, Test znalostí C# .NET online, jsme si ověřili nabyté zkušenosti z kurzu.
Člen
Zobrazeno 8 zpráv z 8.
//= Settings::TRACKING_CODE_B ?> //= Settings::TRACKING_CODE ?>
V předchozím kvízu, Test znalostí C# .NET online, jsme si ověřili nabyté zkušenosti z kurzu.
http://www.itnetwork.cz/…indows-forms
a na přidávání kontrolek používám:
Controls.add(kontrolka);
ale nevím jestli jsem tě správně pochopil
uděláš si metodu (ve formu)
private static IEnumerable<T> GetChildrenOfType<T>(Control parent) where T : Control
{
foreach (var control in parent.Controls)
{
if (control is T)
{
yield return control as T;
}
}
}
která se dá pomocí LINQ zkrátit na:
private static IEnumerable<T> GetChildrenOfType<T>(Control parent) where T:Control
{
return parent.Controls.Cast<Control>().Where(c => c is T).Cast<T>().ToList();
}
Dělá to úplně to samé. Pokud tomu nerozumíš, buď to ber jako
blackbox, nebo si nastuduj generiku a LINQ.
A použiješ to takto:
List<ComboBox> boxes = GetChildrenOfType<ComboBox>(tabControl1.TabPages[i]).ToList();//všechny comboboxy, co jsou přímo obsažené v TabPage
Jinak pokud se ptáš, proč vracím IEnumerable a ne List, dalo by se
říct, že jde víceméně o konvenci.
Metody jsou statické kvůli tomu, že nepracují s instančními proměnnými,
proto je vhodné je označit jako statické kvůli čitelnosti kódu
Ahoj, díky za odpověď.
Kód moc nechápu Nešlo by to
udělat jednodušeji?? Potřebuji z každého comboboxu ze všech záložek
tabcontrol uložit do nějakého listu hodnotu SelectedItem...
Jinak mi to moc nefunguje. Použil jsem to takhle, viz. kód níže. Dotoho
listu boxes se sice uloží combobox (a jeho všechny parametry, jestli jsem to
dobře pohopil), ale při dalším průběhu cyklu se mi hodnota přepíše,
nemělo by tam být Add()?
private static IEnumerable<T> GetChildrenOfType<T>(Control parent) where T : Control
{
foreach (var control in parent.Controls)
{
if (control is T)
{
yield return control as T;
}
}
}
private void button1_Click(object sender, EventArgs e)
{
for(int i = 0; i < tabControl1.TabPages.Count ; i++)
{
List<ComboBox> boxes = GetChildrenOfType<ComboBox>(tabControl1.TabPages[i]).ToList(); //všechny comboboxy, co jsou přímo obsažené v TabPage
}
}
Možná bych měl trochu lépe vysvětlit, co ten kód dělá. Předáš mu
kontrolku, ve které jsou obsažené ty comboboxy.
To, co jsem napsal je univerzální, dá se to použít třeba na tlačítka
panely, všechno. Proto to používá generiku- vše ohledně T a <T>
Pokud bych tu metodu přepsal bez generiky čistě pro comboboxy a zjednodušil,
vypadala by takto:
private static List<Combobox> GetComboBoxes(Control parent)
{
List<Combobox> result=new List<Combobox>();
foreach (var control in parent.Controls)
{
if (control is Combobox)
{
result.Add(control as Combobox);
}
}
result result;
}
A použiješ ji takto:
List<Combobox> allCombos=new List<Combobox>(); //sem se načtou všechny comboboxy ze všech TabPage
foreach (var tab in tabControl1.TabPages)
{
allCombos.AddRange(GetComboBoxes(tab));//načíst všechny, co jsou v dané tabPage
}
potom budeš mít v allCombos všechny comboboxy, které jsou obsažené v
"tabech" tabControl1. Potom to jen projedeš třeba foreach cyklem, kde si
zjistíš u každého comboboxu SelectedItem.
Pokud tohle není co chceš, zkus se vyjádřit nějak lépe, možná jsem tě
nepochopil.
Ahoj, díky za zjednodušení. Teď už je mi to srozumitelnější...
Jen teď když volám metodu: allCombos.AddRange(GetComboBoxes(tab));
tak mi toho vyhodí při kompilaci error: Argument 1: cannot convert from
'object' to 'System.Windows.Forms.Control' a nevím jak to přesně
přetypovat.
Tak se mi to podařilo přetypovat a vypadá to, že to funguje
allCombos.AddRange(GetComboBoxes((Control) tab));//načíst všechny, co jsou v dané tabPage
Zobrazeno 8 zpráv z 8.