none
Problemas com UpdatePanel e Page_Load RRS feed

  • Pergunta

  • Pessoal, no meu page_load eu crio alguns objetos dinamicamente dentro de um updatePanel.
    Vamos supor que seja um textBox e um Button.

    Crio o textBox sem nenhum valor e no click do Button eu coloco uma função que pega o valor digitado no textBox. Algo bem simples, porem tudo criado via codigo em tempo de execução

    protected void Page_Load(object sender, EventArgs e)
    {
    //cria textbox
    TextBox tbCampo = new TextBox();
    tbCampo.Text = "";

    //cria botao
    ImageButton ibEditar = new ImageButton();
    ibEditar.ImageUrl = "~/SITE/LAYOUT/imagem.gif";
    ibEditar.Command += EditaCampo;
    ibEditar.CommandArgument = "campo";
    ibEditar.CommandName = "altera";

    //coloco obetos dentro do updatepanel
    .
    .
    .
    }

    acontece que quando clio no botao, antes de ir para a função EditaCampo, ele passa pelo Page_Load e assim deixa o textBox sem nada, perdendo oque eu tinha digitado nele.
    Tentei colocar um if(!IsPostBack) no page_load, ai o problema é que os objetos não são criados entao quando passa pela funcao EditaCampo o textBox nao existe dando um erro quando eu tento pegar o valor dele. Alguem tem uma solução para o meu caso? como faço pra pegar o valor digitado no textBox?
    terça-feira, 6 de dezembro de 2011 18:12

Todas as Respostas

  • Amigo, tente criar seus controles dinâmicos no evento ONPREINIT caso não tenha uma masterpage ou no ONINIT se você tiver uma master page:

    protected override void OnPreInit(EventArgs e){}


    Olavo Oliveira Neto
    http://olavooneto.wordpress.com
    Twitter @Olavooneto
    Se for útil marque como resposta e faça um Developer feliz :)
    quarta-feira, 7 de dezembro de 2011 11:08
    Moderador
  • Olá Olavo,

    Mesmo assim o problema persiste.
    ele passa pelo onInit e cria o textBox e o botão... mas quando clico no botão ele passa novamente pelo onInit e deixa o campo vazio, perdendo oque eu digitei nele.... se eu colocar a criação dos objetos dentro de um if(!IsPostBack) ele não cria o campo, entao quando ele nm passa pelo botao_click e se eu forçar colocando no page_load pra ver oque acontece ele fala que o textbox nao existe....


    procurando na net encontrei algumas pessoas falando sobre este mesmo problema "eventos de objetos criados dinamicamente não funciona" mas nenhum deles tinha uma resposta para o problema.

    quarta-feira, 7 de dezembro de 2011 14:03
  • talvés tenha dado erro com o IsPostBack poque após colocar isso no código você deu um F5, e isso caracteriza um postback, e ele não criaria os controles.

     


    -------------------------------------- Se a resposta for útil marque como resposta
    domingo, 11 de dezembro de 2011 18:01
  • Juan, não foi feito um postback.... foi feito um click num botao criado dinamicamente, isto não é um postback e deveria passar pela funcao de click do botao, mas isto não acontece pois o botão nao foi cricado...
    segunda-feira, 12 de dezembro de 2011 13:04
  • É realmente necessário criar esses controles?

    Você não pode deixar eles já na página e depois mostrar eles ou alterar suas caracteristicas?

     


    Qualquer resposta útil ou solução deve ser marcada. Assim ajudamos a quem tem o mesmo problema a achar a resposta.
    segunda-feira, 12 de dezembro de 2011 13:29
  • Priscila, pelo minhas ideias, sim.

    Isso porque o numero de "campos" e "botoes" são criados dinamicamente.

     

    trata-se de uma tabela criada dinamicamente onde eu relaciono dados de duas tabelas do bancode dados... e no final de cada coluna eu tenho um botao que irá salvar a edicao dos campos da coluna em questao.... entao dependendo dos parametros esta tabela vai tem um ou duas colunas, mas tem casos que teram 10 colunas... por isso esses objetos sao criados dinamicamente.

    segunda-feira, 12 de dezembro de 2011 13:54
  • isso é muito estranho, pois eu fiz o pequeno exemplo:

    coloquei um asp:panel em uma página web qualquer

    então fiz o seguinte código:

    protected override void OnPreInit(EventArgs e)
    {
                TextBox myTXT = new TextBox();
                myTXT.ID = "myTXT";
    
                Button myBTN = new Button();
                myBTN.Text = "Ação";
                myBTN.Click += new EventHandler(myBTN_Click);
                Panel1.Controls.Add(myTXT);
                Panel1.Controls.Add(myBTN);
    }
    
    void myBTN_Click(object sender, EventArgs e)
    {
                string valor = ((TextBox)Panel1.FindControl("myTXT")).Text;
    }
    


    e consegui capturar os valores digitados sem problema.

     


    Olavo Oliveira Neto
    http://olavooneto.wordpress.com
    Twitter @Olavooneto
    Se for útil marque como resposta e faça um Developer feliz :)
    segunda-feira, 12 de dezembro de 2011 15:05
    Moderador