EventHandlers Csharp

andrepadez

Power Member
Boas,

Tenho uma matriz de [8x8] pictureboxes, "SquareButtons".
é criada no form principa, onload, com um for quadrático.

Quero que todas elas funcionem como um botão, cujas acções sejam iguais, mas sejam controláveis uma a uma pelos índices da matriz.

Inseri dentro dos for de criação das mesmas a linha

squareButtons[rank, file].Click += new EventHandler(SquareButton_Click);

queria de alguma forma enviar como argumentos a posição xy na matriz.

Anyone???

Obrigado
 
Ao criar as pictureboxes, podes atribuir-lhes um nome baseado na posição. Por exemplo,
Código:
squareButtons[rank, file].Name = "squareButton" + rank + file;
Assim, no event handler, basta obter o nome do control para ficares a saber a posição correspondente.

Uma solução mais "orientada a objectos" seria criar uma nova classe chamada squareButton, herdada da classe Button, que possuiria uma propriedade adicional para indicar a posição.
 
Última edição:
Obrigado Wizzard. Mais umavez foste uma grande ajuda. Mas o problema não é só esse, tem mais a ver com o eventhandler em si. Vou tentar ser mais explícito agora:

em cada cíclo do for, estou a atribuir nome indexado para cada uma. Agora o que eu quero é criar um eventhandler para cada uma:

Código:
squareButtons[rank, file].Click += new EventHandler(SquareButton_Click);
e depois, ao carregar naquele botão:
Código:
private void SquareButton_Click(object sender, EventArgs e)
{
///onde aqui poder saber qual a squareButton que tenha sido clickada,
///e poder mandar mensagens para aceder e alterar suas propriedades. 

}
Capisce?:001:

Isto deve ser muito básico, eu é que há muitas cenas que ainda não sei.

De qq maneira obrigado
 
Código:
private void SquareButton_Click(object sender, EventArgs e)
{
///onde aqui poder saber qual a squareButton que tenha sido clickada,
///e poder mandar mensagens para aceder e alterar suas propriedades. 

}
Nessa zona, podes meter coisas do tipo:
Código:
int x, y;
using (PictureBox sqButton = sender)
{
  x = sqButton.Name.Substring(sqButton.Name.Length - 2, 1);
  y = sqButton.Name.Substring(sqButton.Name.Length - 1, 1);
  //...
}
 
Desculpa,
se eu introduzir o código como dizes, o compilador diz que não consegue converter implicitamente PictureBox em Objecto...

Obrigado
 
Uma solução mais "orientada a objectos" seria criar uma nova classe chamada squareButton, herdada da classe Button, que possuiria uma propriedade adicional para indicar a posição.
Já pensei fazer isso, e poderá ficar para depois, mas isso continua sem me resolver a situação.

Já experimentei fazer com o MouseEventHandler, mas as coordenadas que me devolve são relativas ao botão, e não à form.
Já estou a desesperar.
 
Mais uma vez obrigado; acabou por funcionar, mas tive de martelar um bocado. Passo a explicar:

Quando faço o
using (PictureBox square = sender as PictureBox)

é criada uma nova PictureBox que se sobrepõe à que estou a invocar. Tenho de voltar a colocar no seu sítio uma nova com os atributos que quero.

Há alguma maneira de ultrapassar isto???

Mais uma vez um grande obrigado
 
Experimenta:
Código:
using (PictureBox sqButton = (PictureBox)sender)
Pensava que era a mesma coisa que "sender as PictureBox", mas se calhar não.
 
Boas Wizzard.

Depois de muita tentativa e erro, e com base nas dicas que me foste dando, aqui fica a solução para quem quiser.
Acabei por tornar a minha classe Square em "filha" de Picturebox, onde lhe adicionei como variáveis de instância o x e y na matriz.
No form load, coloco o tabuleiro de 8*8 Squares com

Código:
for (int file = 0; file < 8; file++)
for (int rank = 0; rank < 8; rank++)
        boardTest.squares[rank, file].Click += new EventHandler(SquareButton_Click);
e a função funciona assim (nem precisei do using, bastou-me fazer o cast normalmente):
Código:
public void SquareButton_Click(object sender, EventArgs e)
{
int rank, file;
Square test = (Square)sender;
rank = test.X;
file = test.Y;
MessageBox.Show(rank.ToString() + file.ToString());

Mais uma vez obrigado por tudo.
 
o cast funcionava como tu dizias para obter os argumentos.
Mas por alguma razão quando o fazia, sobrepunha-me uma nova Picturebox em cima da minha e eu tinha de estar sempre a criar outra igual e a dar-lhe atributos. Alta dôr de cabeça.

Eu não programava há 10 anos, e venho da escola imperativa. Estou a perceber aos poucos como funciona a *****, e isto é lindo.

Abraço
 
Back
Topo