Ir para o conteúdo
evgeny186

Butões criadas dinamicamente

Mensagens Recomendadas

evgeny186

Preciso de gerar um numero infinito de botões todos com o nome diferente, no código c#. As botões são giradas ao clicar no botão "adicionar mais". O meu problema e que no momento em que eu clico num dos botões gerados ele cria mais um botão, não percebo o porque nem como posso resolver isso.

public static class MyClass
{
 public static bool clicado;
 public static int valor { get; set; }
 public static int valor2 { get; set; }
}
 protected void Page_Load(object sender, EventArgs e)
{
 if (!Page.IsPostBack)
 {
	 MyClass.valor = 0;
	 MyClass.clicado = true;
 }
 if (MyClass.clicado == true && Page.IsPostBack)
 {
	 MyClass.valor++;
	 MyClass.clicado = false;
 }
 CreateButtons();
 MyClass.valor2 = 0;


}
protected void Button1_Click(object sender, EventArgs e)
{
 MyClass.clicado = true;
	 //MyClass.valor++;
}
private void CreateButtons()
{
 for (int i = 0; i < MyClass.valor;i++ )
 {
	 Button button = new Button();
	 button.Text = "ola";
	 button.ID = "ola_" + MyClass.valor2++;
	 button.Click += new EventHandler(ShowMessage);
	 button.Attributes.Add("runat", "server");
	 resultHolder.Controls.Add(button);
 }
}

void ShowMessage(Object sender, EventArgs e)
{
 ClientScript.RegisterStartupScript(this.GetType(), "myalert", "alert('isto é um teste');", true);
}

Editado por apocsantos
geshi

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
He B TeMy
ClientScript.RegisterStartupScript(this.GetType(), "myalert", "alert('isto é um teste');", true);

O que é que isto faz?

Editado por apocsantos
geshi

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Rechousa

Viva,

Aparentemente, o problema acontece porque o método que cria o botão (CreateButtons) está a ser invocado no Page_Load. O evento Page_Load é disparado sempre que a página é carregada (sempre que carregas num botão ou fazes um post para o servidor), enquanto que deveria estar a ser invocado no Click do botão "+" (que pelo código deverá ser o método Button1_Click".

Recomento-te a pesquisares no google sobre "ASP.Net Webforms Page Life Cycle".

Relativamente ao problema, eu mudaria o código para o seguinte:

public static class MyClass
{
	 public static bool clicado;
	 public static int valor { get; set; }
	 public static int valor2 { get; set; }
}
	 protected void Page_Load(object sender, EventArgs e)
{
	 if (!Page.IsPostBack)
	 {
			 MyClass.valor = 0;
			 MyClass.clicado = true;
	 }
	 if (MyClass.clicado == true && Page.IsPostBack)
	 {
			 MyClass.valor++;
			 MyClass.clicado = false;
	 }
	 // CreateButtons(); --> Deixa de invocar o método no Page_Load
	 MyClass.valor2 = 0;


}
protected void Button1_Click(object sender, EventArgs e)
{
	 MyClass.clicado = true;
			 //MyClass.valor++;

    // Passa a invocar o método aqui:
	 CreateButtons();
}

private void CreateButtons()
{
	 for (int i = 0; i < MyClass.valor;i++ )
	 {
			 Button button = new Button();
			 button.Text = "ola";
			 button.ID = "ola_" + MyClass.valor2++;
			 button.Click += new EventHandler(ShowMessage);
			 button.Attributes.Add("runat", "server");
			 resultHolder.Controls.Add(button);
	 }
}

void ShowMessage(Object sender, EventArgs e)
{
	 ClientScript.RegisterStartupScript(this.GetType(), "myalert", "alert('isto é um teste');", true);
}

Espero ter ajudado,


Pedro Martins

Sharing is Knowledge!

http://www.linkedin.com/in/rechousa

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
evgeny186

Sim realmente tens razão, o problema e que os botões criados dinamicamente tem de ser carregados todas as vezes que a página é carregada senão não dá, já tentei da maneira como tu me disseste, mas apesar de os botões serem criados de forma correcta, eles não tem qualquer evento associado a eles. Eu percebo perfeitamente que o problema que eu tenho e que o Button1_Click é lido em ultimo lugar, o que faz com que MyClass.clicado passa a falso depois de eu ter efectuado 2 vezes pageload

mas infelizmente , se eu não chamar o evento CreateButtons() no pageload ou num outro evento chamado onload() o que acontece e que os

botões criados não tem qualquer evento associado a eles, como é o caso. Quando a duvida do He B Te My acerca da linha

ClientScript.RegisterStartupScript(this.GetType(), "myalert", "alert('isto é um teste');", true);

O que é que isto faz?

o que isto faz é exactamente a mesma coisa que faz o comando

Response.write("isto é um teste")

, a única diferença e que em vez de a mensagem aparecer em texto normal aparece em javascript, ou seja aparece uma janela que diz : isto é um teste.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!

Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.

Entrar Agora

×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade. Este site usa cookies para disponibilizar funcionalidades personalizadas. Para mais informações visite esta página.