Válí se ti projekty v šuplíku? Dostaň je mezi lidi a získej cool tričko a body na profi IT kurzy v soutěži ITnetwork summer 2017!
Přidej si svou IT školu do profilu a najdi spolužáky zde na síti :)

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

C# .NET .NET (C# a Visual Basic) Dynamické vytvorenie ľubovolného počtu komponentov American English version English version

Aktivity (1)
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
Posix
Člen
Avatar
Odpovídá na František Pastorek
Posix: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
Proč to dělat jednoduše, když to jde složitě.
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ý
Redaktor
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í
+1 bodů
Řešení problému
 
Nahoru Odpovědět  +1 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ý
Redaktor
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
:)
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ý
Redaktor
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ý
Redaktor
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  +1 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.