Přidat otázku mezi oblíbenéZasílat nové odpovědi e-mailemVyřešeno Nefunkční událost/i na poli Buttonů - [C#]

Dobrý den.

Řekněme, že mám formulář a v něm pole Buttonů:

Button[,] btn = new Button[10, 10];

...pak mám např. tuto událost:

protected override void OnMouseMove(MouseEventArgs e)
        {
            string x = Convert.ToString(e.X);
            string y = Convert.ToString(e.Y);
            Text = "[" + x + "," + y + "]";//jen jako příklad :)          
        }

no a problém je v tom, že mi to souřadnice zobrazuje všude mimo toho pole tlačítek, tz. jakmile kurzorem najedu na ty tlačítka, tak to souřadnice nezobrazuje. Potřeboval bych zajistit, aby to fungovalo i na buttonech, jak na to?

Děkuju.

Jsou zobrazeny jen nové odpovědi. Zobrazit všechny
Předmět Autor Datum
Podle toho co píšeš zřejmě ta událost není přiřazena k těm buttonům.
Mitch 25.05.2008 11:12
Mitch
No to máš pravdu. Zkoušel jsem to nějak takto: btn[i, j].Click += new System.EventHandler(sem nevím…
deadfast22 25.05.2008 11:28
deadfast22
Příklad za tisíc slov :) private void Form1_Load(object sender, EventArgs e) { Button[] btn = new B…
Mitch 25.05.2008 11:56
Mitch
Dobrý den, mám sub-dotaz. Vytvořil jsem si pole buttonů obdobně, jak je na příkladu. Mám ale problém…
PtrF 20.11.2012 13:49
PtrF
Mám ale problém v tom, že k poli musím přistupovat, i když vyvolám událost, která s tímto polem neso…
Flash_Gordon 20.11.2012 14:08
Flash_Gordon
Děkuji za odpověď, bohužel nechápu z nich ani jednu. Nic nemažu, maximálně nuluji zadaný text z těch…
PtrF 20.11.2012 21:48
PtrF
Až si něco přidáš na formulář, tak ti to z designeru zmizí. A co přesně ti to píše? Protože s prvkem… nový
Wikan 20.11.2012 21:53
Wikan
na řádku s: pole[i, j]; -> Cannot apply indexing with [] to an epxression type System.Windows.Forms.… nový
PtrF 20.11.2012 22:11
PtrF
A ten kód je přesně jaký? nový
Wikan 20.11.2012 22:13
Wikan
U Form1.Designer.cs : System.Windows.Forms.Button[,] pole = new System.Windows.Forms.Button[15, 15]… nový
PtrF 20.11.2012 22:16
PtrF
A co s tím konkrétním buttonem hodláš dělat? Přistupovat k němu můžeš úplně stejně jako v tom design… nový
Wikan 20.11.2012 22:19
Wikan
No, konkrétně si chci napsat jednu metodu pro smazání pole SmazPole(). Potom do něj budu kreslit kol… nový
PtrF 20.11.2012 22:39
PtrF
Právě že ten přístup stejně jako v designeru mi nefunguje a nevím, čím to je. Plnění konkrétních but… nový
PtrF 21.11.2012 00:19
PtrF
string text = pole[i,j].Text; Nefunguje? nový
Wikan 21.11.2012 06:40
Wikan
No, přesně to nefunguje a píše to chybu, co jsem psal. Když jsem to konzultoval s někým zkušennějším… nový
PtrF 21.11.2012 17:17
PtrF
Tak jsem zkusil i ten breakpoint a v poli pole je hodnota null. Alespoň u události MouseDown. Když s… nový
PtrF 21.11.2012 17:43
PtrF
Evidentně ty tlačítka někdy z pole smažeš, nebo vytvoříš nové pole. nový
Wikan 21.11.2012 18:10
Wikan
To by mě právě zajímalo, jakým způsobem jsem toho mohl docílit a jak to odstranit. Ani když v tom kó… nový
PtrF 21.11.2012 18:19
PtrF
Dej sem kompletní kód. nový
Wikan 21.11.2012 18:21
Wikan
Asi jsem to právě vyřešil. řádek: System.Windows.Forms.Button[,] pole = new System.Windows.Forms.Bu… nový
PtrF 21.11.2012 18:34
PtrF
Pokud jsi ten řádek měl v designeru i ve Form_Load, tak je to zcela jasné. Podruhé jsi vytvořil zcel… nový
Wikan 21.11.2012 18:41
Wikan
Nene, měl jsem ho pouze v Designeru. Nebo pouze ve Form_Load a nefungovalo to. Nesmí být ani v jedno… nový
PtrF 21.11.2012 22:57
PtrF
Někde to být musí, jinak by jsi s tím nemohl pracovat. poslední
Wikan 22.11.2012 07:17
Wikan
ono pred programovanim je dobre si najprv ujasnit ze co kde kedy sa spusta a preco, kam sa tie data… nový
MM.. 21.11.2012 19:01
MM..

No to máš pravdu. Zkoušel jsem to nějak takto:

btn[i, j].Click += new System.EventHandler(sem nevím co dát);//do té závorky by měl
//přijít název tlačítka ne?
.
.
.
private void *_Click(object sender, MouseEventArgs e)//za * by měl být název tlačítka ne?
        {
            string x = Convert.ToString(e.X);
            string y = Convert.ToString(e.Y);
            Text = "[" + x + "," + y + "]";
        }

Ovšem nevím, co dát jako parametr new System.EventHandler();...protože pokud se nepletu, tak by tam měl být název toho tlačítka, ale pokud je generuju pomocí cyklu, tak mám vlastně 100 různých názvů tlačítek...takže se teda ptám, jak na x různých názvů tlačítek navázat jednu událost? Bohužel nevím, jak to zapsat.

Příklad za tisíc slov :)

private void Form1_Load(object sender, EventArgs e)
        {
            Button[] btn = new Button[10];

            for (int i = 0; i < 10; i++)
            {
                btn[i] = new Button();

                btn[i].Text = i.ToString();
                btn[i].Left = 10;
                btn[i].Top = i * 25;
                btn[i].Click += new EventHandler(ClickHandler);
                btn[i].MouseMove += new MouseEventHandler(MouseMoveHandler);

                Controls.Add(btn[i]);
            }
        }

        public void ClickHandler(Object sender, EventArgs e)
        {
            MessageBox.Show(((Button)sender).Text);
        }

        public void MouseMoveHandler(Object sender, MouseEventArgs e)
        {
            this.Text = e.Y.ToString();
        }

Dobrý den,
mám sub-dotaz. Vytvořil jsem si pole buttonů obdobně, jak je na příkladu.
Mám ale problém v tom, že k poli musím přistupovat, i když vyvolám událost, která s tímto polem nesouvisí.
Například smažu obsah pole "btn" po kliknutí tlačítka v menu.
Problém v metodě SmazPole(), ať už je implementována jakkoli (resp. kdekoli jinde v programu vyjma Form1_Load() nevidím pole "btn", nemůžu k němu přistupovat, zjišťovat, ani měnit hodnoty.

Jediné řešení, které mě napadlo, je našoupat všechna generovaná tlačítka ještě do společného kontejneru, který by byl už vytvořen ve vizuálním návrháři. Ale ani tak nevím přesně, jestli by to nějakým způsobem šlo.

C# zatím začínám. V Delphi stačilo použít StringGrid a nemuselo se implementovat pole tlačítek.
Dokázal by někdo poradit? Děkuji

Mám ale problém v tom, že k poli musím přistupovat, i když vyvolám událost, která s tímto polem nesouvisí.

Nemusíš.

Například smažu obsah pole "btn" po kliknutí tlačítka v menu..... nemůžu k němu přistupovat, zjišťovat, ani měnit hodnoty.

Ano. Tak už to bývá, když objekty zrušíš a pak s nimi chceš pracovat.

Děkuji za odpověď, bohužel nechápu z nich ani jednu.
Nic nemažu, maximálně nuluji zadaný text z těch buttonů.

Ale už jsem se v programu malinko posunul. Už to pole, které mám nazvané jako "pole" vidím ve všech metodách. Stačilo dát kód z Form1_Load() do Form1.Designer.cs. Bohužel, stále nevím jakým způsobem přistupovat k i-tému,j-tému prvku (pole butonnů 15x15).

Něco jako pole[i,j] v cyklu je nesmysl, protože to mi píše, že k prvku typu button nemůžu přistupovat jako v poli.
Poradí někdo, prosím?

U Form1.Designer.cs :

System.Windows.Forms.Button[,] pole = new System.Windows.Forms.Button[15, 15];

int indx = 2;
int x = 12, y = 37;

for (int i = 0; i < 15; i++)
{
for (int j = 0; j < 15; j++)
{

pole[i, j] = new System.Windows.Forms.Button();
pole[i, j].Name = "btn" + i.ToString() + j.ToString();
pole[i, j].Size = new System.Drawing.Size(20, 20);
pole[i, j].Location = new System.Drawing.Point(x, y);
pole[i, j].TabIndex = indx;
pole[i, j].BackColor = System.Drawing.Color.White;
pole[i, j].FlatStyle = System.Windows.Forms.FlatStyle.Flat;
pole[i, j].Text = "";
pole[i, j].UseVisualStyleBackColor = false;

x += 19;
indx++;

Controls.Add(pole[i, j]);

pole[i, j].MouseDown += new System.Windows.Forms.MouseEventHandler(this.HraciP ole_MouseDown);

}
}

u Form1.cs

private void HraciPole_MouseDown(object sender, MouseEventArgs e)
{

for (int i = 0; i < 15; i++)
{
for (int j = 0; j < 15; j++)
{
?????? pole[i, j];

}

}
}

No, konkrétně si chci napsat jednu metodu pro smazání pole SmazPole().
Potom do něj budu kreslit kolečka a křížky, to se dává po jednom, to funguje.
A pak budu muset zjisťovat hodnoty všech prvků pole a dát si je do pracovního pole,
a testovat výhru, případně vzorky, díky kterým to bude hrát velmi jednoduchý algoritmus piškvorek
(který jsem dělal asi před dvěma lety v Delphi, teď jsem to chctěl zkusit v C#).

Právě že ten přístup stejně jako v designeru mi nefunguje
a nevím, čím to je. Plnění konkrétních butonnů by bylo již vyřešeno,
ale zjišťování jejich hodnot z toho nadřezazeného pole najednou,
to mi prostě nějak nejde..

No, přesně to nefunguje a píše to chybu, co jsem psal.
Když jsem to konzultoval s někým zkušennějším, tak říkal, že je nějaká divná ta deklarace (první řádek),
v C++ by to naprosto hlásilo tisíce chyb a že bych si mohl nastavit breakpointy a podívat se,
co obsahuje to pole a jakého je typu. Tak to můžu zkusit.

Kdyby se to podařilo někomu vyřešit, byl bych moc rád.

Tak jsem zkusil i ten breakpoint a v poli pole je hodnota null.
Alespoň u události MouseDown. Když si breakpoint nastavím u Form1_Load, tak jsou tam normálně ta tlačítka.
Sakra, vím, že je problém mezi židlí a obrazovkou, a já přesně nevidím kde

Asi jsem to právě vyřešil.

řádek: System.Windows.Forms.Button[,] pole = new System.Windows.Forms.Button[15, 15];
nemůžu volat ve Form1_Load(), ale tuto deklaraci dělat mimo
(přímo pod úrovní public partial class Form1 : Form )

Potom uvidím pole i v dalších metodách a přístup bude fungovat.
Děkuji za rady.

ono pred programovanim je dobre si najprv ujasnit ze co kde kedy sa spusta a preco, kam sa tie data nadrbu, jaku maju viditelnost a zivotnost. Ak to neni nikde napisane tak zmenit vyvojove prostredie/jazyk. Ak to je niekde napisane tak si to precitat. Bez google sa uci dost tazko.
Do programu nemozes pisat nejake riadky len tak skusmo bez toho aby si presne vedel ze co pises a ze preco to pises prave tam a nie o stranu dalej.

Zpět do poradny Odpovědět na původní otázku Nahoru