IT rekvalifikace s garancí práce. Seniorní programátoři vydělávají až 160 000 Kč/měsíc a rekvalifikace je prvním krokem. Zjisti, jak na to!
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

Diskuze: Dynamické vytvorenie ľubovolného počtu komponentov

Aktivity
Avatar
František Pastorek:25.11.2014 1:35

Dynamicky vytvoriť ľubovoľný komponent nie je problém. Ale čo keď potrebujem vytvorit toľko komponentov koľko si používateľ želá? Napr. 10? Pri dynamickom vytváraní komponentu neviem zadať názov komponentu formou pola. Neviem ako inak.

Klasické a jednoduché dynamické vytvorenie radiobutton-u:

RadioButton radioButton1 = new RadioButton();
radioButton1.Text = "radioButton1";
radioButton1.Location = new System.Drawing.Point(12, 48);
Controls.Add(radioButton1);

Ale potreboval by som niečo takéto ale neviem si rady.

for(int i = 0; i < n; i++)
{
RadioButton radioButton+i = new RadioButton();
radioButton+i.Text = "radioButton" + i;
radioButton+i.Location = new System.Drawing.Point(12, i*30);
Controls.Add(radioButton+i);
}

Niečo na tento princíp. Poprípade by stačilo keby to šlo so stringovým polom.

Vopred ďakujem za akúkoľvek pomoc.

Editováno 25.11.2014 1:36
 
Odpovědět
25.11.2014 1:35
Avatar
Odpovídá na František Pastorek
Neaktivní uživatel:25.11.2014 1:49

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);
}
Nahoru Odpovědět
25.11.2014 1:49
Neaktivní uživatelský účet
Avatar
František Pastorek:25.11.2014 12:18

Funguje to len ked kazdy objekt ma rovnaky nazov nedokazem k nim pristupovat zvlast.

 
Nahoru Odpovědět
25.11.2014 12:18
Avatar
Odpovídá na František Pastorek
Andrej Farkaš:25.11.2014 12:32

Ten názov je aj tak platný len v rámci toho for, nie? Po ňom je to už len radiobutton v kolekcii kontroliek.

Nahoru Odpovědět
25.11.2014 12:32
Live. Love. Learn.
Avatar
Jan Vargovský
Tvůrce
Avatar
Odpovídá na František Pastorek
Jan Vargovský:25.11.2014 13:34

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.AddRan­ge(controls) a můžeš snimi dělat co chceš skrz tu kolekci/pole.

Editováno 25.11.2014 13:37
Akceptované řešení
+20 Zkušeností
+2,50 Kč
Řešení problému
 
Nahoru Odpovědět
25.11.2014 13:34
Avatar
František Pastorek:25.11.2014 19:30

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.

 
Nahoru Odpovědět
25.11.2014 19:30
Avatar
Jan Vargovský
Tvůrce
Avatar
Odpovídá na František Pastorek
Jan Vargovský:25.11.2014 19:58

Nevím jaký je rozdíl mezi radioButton1.­..radioButtonn a radiobutton[1...n].

 
Nahoru Odpovědět
25.11.2014 19:58
Avatar
Odpovídá na František Pastorek
Luboš Běhounek Satik:25.11.2014 20:26

Uh, stejně všechny RadioButtony provádějí stejný nebo obdobný kód, ne?

Nahoru Odpovědět
25.11.2014 20:26
https://www.facebook.com/peasantsandcastles/
Avatar
František Pastorek:25.11.2014 21:06

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

Editováno 25.11.2014 21:07
 
Nahoru Odpovědět
25.11.2014 21:06
Avatar
František Pastorek:25.11.2014 21:45

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";
            }
        }
 
Nahoru Odpovědět
25.11.2014 21:45
Avatar
František Pastorek:25.11.2014 21:50

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.

 
Nahoru Odpovědět
25.11.2014 21:50
Avatar
František Pastorek:25.11.2014 22:02

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";
            }
        }
    }
}
 
Nahoru Odpovědět
25.11.2014 22:02
Avatar
Jan Vargovský
Tvůrce
Avatar
Odpovídá na František Pastorek
Jan Vargovský:25.11.2014 22:09

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.

 
Nahoru Odpovědět
25.11.2014 22:09
Avatar
Jan Vargovský
Tvůrce
Avatar
Odpovídá na František Pastorek
Jan Vargovský:25.11.2014 22:11

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();
        }
    }
 
Nahoru Odpovědět
25.11.2014 22:11
Avatar
Odpovídá na Jan Vargovský
František Pastorek:25.11.2014 22:25

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.

 
Nahoru Odpovědět
25.11.2014 22:25
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 15 zpráv z 15.