Diskuze: Dynamické vytvorenie ľubovolného počtu komponentov
Člen
Zobrazeno 15 zpráv z 15.
//= Settings::TRACKING_CODE_B ?> //= Settings::TRACKING_CODE ?>
bez toho +i to nefunguje?
for(int i = 0; i < n; i++)
{
RadioButton radioButton = new RadioButton();
radioButton.Text = "radioButton" + i;
radioButton.Location = new System.Drawing.Point(12, i*30);
Controls.Add(radioButton);
}
Funguje to len ked kazdy objekt ma rovnaky nazov nedokazem k nim pristupovat zvlast.
Ten názov je aj tak platný len v rámci toho for, nie? Po ňom je to už len radiobutton v kolekcii kontroliek.
Taková věc v C# nejde. Pokud chceš vytvořit N prvků, tak si třeba můžeš udělat tohle:
private IEnumerable<T> CreateComponents<T>(int count) where T : Control, new()
{
while (count-- > 0)
yield return new T();
}
var controls1 = CreateComponents<RadioButton>(5).ToArray();
for (int i = 0; i < controls1.Count(); i++)
{
controls1[i].PropertyX = "xxx";
controls1[i].PropertyY = "yyy";
}
nebo nějak bez metod pro konkrétní použití:
RadioButton[] controls = new RadioButton[N];
for (int i = 0; i < controls.Length; i++)
controls[i] = new RadioButton
{
PropertyX = "xxx",
PropertyY = "yyy",
};
EDIT: Pak jen ve výsledku přidáš Controls.AddRange(controls) a můžeš snimi dělat co chceš skrz tu kolekci/pole.
No ok, tak to povytvaram vsetko rucne, vela riadkov ale čo už. Aj tak Vám všetkým dakujem, narazil som na dalsie problémy ale tie radsej v dalsom topicu. Ďakujem všetkym.
Nevím jaký je rozdíl mezi radioButton1...radioButtonn a radiobutton[1...n].
Uh, stejně všechny RadioButtony provádějí stejný nebo obdobný kód, ne?
Aky je v tom rozdiel? S pouzitím zátvoriek mi to nejde aplikovať na toto:
radioButton1.CheckedChanged += new System.EventHandler(radioButton1_CheckedChanged);
a bez toho, teda aspoň ja, neviem reagovať na klik. Alebo teda zmenu Checked radiobuttonu
Diky, nejak som to rozchodil a to nasledovne
RadioButton[] radioButton = new RadioButton[5];
public Form1()
{
InitializeComponent();
for (int i = 0; i < 5; i++)
{
radioButton[i] = new RadioButton();
radioButton[i].Text = "skuska" + i.ToString();
radioButton[i].Location = new System.Drawing.Point(12, 30 + i * 30);
radioButton[i].CheckedChanged += new System.EventHandler(MyradioButton_CheckedChanged);
}
Controls.AddRange(radioButton);
}
private void MyradioButton_CheckedChanged(object sender, EventArgs e)
{
if (radioButton[2].Checked)
{
label1.Text = "FUNGUJE 2";
}
}
Akurat by ma zaujimalo preco mi toto nefunguje.
int n = 5;
RadioButton[] radioButton = new RadioButton[n];
Nechce mi to brat dynamicky urcteny pocet. Aj napriek tomu ze to dynamicky alokujem.
No viem kde to robi ale neviem preco.
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace WindowsFormsApplication11
{
public partial class Form1 : Form
{
int n = 5;
RadioButton[] radioButton = new RadioButton[n]; //tuto to nefunguje
public Form1()
{
InitializeComponent();
RadioButton[] radioButton = new RadioButton[n]; //tuto to funguje
for (int i = 0; i < n; i++)
{
radioButton[i] = new RadioButton();
radioButton[i].Text = "skuska" + i.ToString();
radioButton[i].Location = new System.Drawing.Point(12, 30 + i * 30);
radioButton[i].CheckedChanged += new System.EventHandler(MyradioButton_CheckedChanged);
}
Controls.AddRange(radioButton);
}
private void MyradioButton_CheckedChanged(object sender, EventArgs e)
{
if (radioButton[2].Checked)
{
label1.Text = "FUNGUJE 2";
}
}
}
}
A co ti to hlásí za chybu?
Btw u toho handleru na CheckedChanged jde přímo vytáhnout ten daný RadioButton z senderu, jen si ho přetypuj.
Jo, jasně. Ono nikdy nevíš v jakém pořadí si vezme kompilátor instanční prvky, takže od toho existuje konstruktor a můžeš udělat tohle:
public partial class Form1 : Form
{
int n = 5;
RadioButton[] radioButton;
public Form1()
{
InitializeComponent();
radioButton = new RadioButton[n];
}
}
nebo nadefinovat konstantu
public partial class Form1 : Form
{
const int n = 5;
RadioButton[] radioButton = nwe RadioButton[n];
public Form1()
{
InitializeComponent();
}
}
Nieeeeeee, teraz vyzeram ako debil, absolutne ma ten konstruktor nenapadol. Dakujem ti, to je presne to, a prepac ze som nevedel, ze kompilator nebere vzdy v rovnakom poradi instantne prvky. A konstanta napadla aj mna ale data budem tahat z xml suboru takze konstantu si nemozem dovoli. Diky moc.
Zobrazeno 15 zpráv z 15.