CONTROLES EM TEMPO DE EXECU?ÃO

PERCIFILHO 12/06/2017 15:46:19
#474468
Boa tarde, amigos.
Gostaria de saber onde estou errando ao criar controles em tempo de execução. O que estou [Ô]tentando[Ô] fazer é assim:
Tenho 3 Painéis e dentro deles vou inserir algumas PictureBoxes. Estou fazendo assim:
int posicaoinicial_X = 10; int posicaoinicial_Y = 10;
int posicao = 35;
foreach (var item in jogador1)
{
PictureBox pic = new PictureBox();
pic.Image = Image.FromFile(item.Imagem);
pic.Location = new Point(posicaoinicial_X, posicaoinicial_Y);
pic.Size = new Size(30, 60);
pnlJogador1.Controls.Add(pic);
posicaoinicial_X += posicao;
}

Aqui, ele cria as PictureBoxes dentro do primeiro painel.
Faço a mesma operação para criar os PictureBoxes dentro do segundo painel (pnlJogador2), só que simplesmente não cria, o segundo painel fica vazio.
Alguém consegue me dar uma luz?
PERCIFILHO 12/06/2017 16:01:25
#474469
Ah, pessoal, me desculpem, mas eu cometi um erro infantil. Antes de criar as Pictures dentro dos painéis eu estava criando no Form, então eu usava outras coordenadas. Esqueci de alterar essas coordenadas para mostrar nos painéis, por isso que parecia que não estava criando. Estava, mas em outras coordenadas.
Agora já corrigi o erro e está tudo conforme eu planejei. Obrigado a todos os que pelo menos leram o post.
Até mais.
PERCIFILHO 13/06/2017 14:40:11
#474497
Bom, pessoal, aproveitando o mesmo tópico aberto, estou com a seguinte dúvida:
Se eu criar, por exemplo, 3 PictureBox dentro do Panel em tempo de execução, como estou fazendo acima;
como fazer para associar um método quando clicar numa PictureBox? Terei que definir um nome para cada uma delas na criação?
Será que existe outra maneira, ou não é possível fazer isso?
JABA 13/06/2017 16:49:34
#474499
Resposta escolhida
Você precisa criar um handle para cada imagem.

int posicaoinicial_X = 10; int posicaoinicial_Y = 10;
int posicao = 35;
foreach (var item in jogador1)
{
PictureBox pic = new PictureBox();
pic.Image = Image.FromFile(item.Imagem);
pic.Location = new Point(posicaoinicial_X, posicaoinicial_Y);
pic.Size = new Size(30, 60);
pnlJogador1.Controls.Add(pic);
posicaoinicial_X += posicao;
[txt-color=#e80000]pic.Click += new System.EventHandler(this.pic_Click);[/txt-color]
}

private void pic_Click(object sender, EventArgs e)
{
MessageBox.Show(sender.Name);
}

PERCIFILHO 14/06/2017 09:48:39
#474512
Bom dia, Jaba.
Pois eu criei o handle da forma como você mostrou, porém, no evento Click, se eu quiser mostrar o nome do controle,
MessageBox.Show(sender.Name); aparece o erro:
[txt-color=#e80000]object does not contain a definition for [ô]Name[ô] and no extension method [ô]Name[ô] accepting a first argument of type [ô]object[ô] could be found[/txt-color]
Eu preciso de uma maneira onde eu clico na terceira imagem, por exemplo, e o programa saiba que eu estou clicando nela e não em outra.
JABA 14/06/2017 13:20:00
#474514
é só fazer uma conversão. Não se esqueça de dar um nome para a imagem, senão vai aparecer uma mensagem vazia.

MessageBox.Show(((PictureBox) sender).Name);


PERCIFILHO 14/06/2017 14:17:49
#474515
Show de bola, Jaba, é isso aí, muito obrigado mesmo.
Até mais.
FFCOUTO 14/06/2017 15:59:02
#474516
Porque você não utiliza a propriedade TAG existente no PictureBox? Tal propriedade, pode inclusive, armazenar um objeto. E com isso você poderia manipular muito mais facilmente a sua rotina.

Para atribuir:
pic.Tag = SeuObjeto;


Para obter o conteúdo
var obj = (SeuObjeto)pic.Tag;
PERCIFILHO 20/06/2017 08:47:53
#474625
Obrigado, FFCOUTO, mas fiz como o JABA sugeriu e atendeu à minha necessidade.
Havia me esquecido de encerrar.
Até mais.
Tópico encerrado , respostas não são mais permitidas