Avatar
František Pastorek:

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:

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:

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š:

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ý:

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:

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ý:

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):

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:

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:

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:

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:

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ý:

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ý:

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:

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.