none
Resgatar o valor de um TexBox criando dinamicamente dentro um PlaceHolder RRS feed

  • Pergunta

  • Boa noite!

    Criei método que insere os valores recuperados a partir do banco de dados:

     SqlCommand cmd = new SqlCommand();
            cmd.CommandType = CommandType.StoredProcedure;
            cmd.Connection = cn.OpenOrCloseCNo(true);
            cmd.Parameters.Add("@ID_PRODUTO", SqlDbType.Int).Value = id_prod;
            cmd.CommandText = "LoadSetProduct";
    
            SqlDataReader dr;
            dr = cmd.ExecuteReader();
    
            //
    
    
            if (dr.HasRows)
            {
    
                int count = 0;
    
    
    
                while (dr.Read())
                {
                    string campo = "Produto" + count.ToString();
    
                    TextBox campos = new TextBox();
                    campos.Text = dr["DESCRICAO_PROD"].ToString();
                    campos.ID = "txtCampo" + dr["ID_DESCRICAO"].ToString();
    
                    campos.CssClass = "P1";
                    PHContent.Controls.Add(campos);
                }

    preciso recupar o valor de cada TextBox de alguma forma,  já li alguns artigos no forum mas não resolver meu problema, talves porque o meu esta dentro de um PlaceHolder

    Obrigado


    Rodrigo de Farias

    quinta-feira, 3 de outubro de 2013 22:18

Respostas

  • Rodrigo,

    Vendo seu problema, encontrei um artigo que explica tudo o que você precisa saber para solucioná-lo utilizando exemplos para facilitar a compreensão:

    http://www.asp.net/web-forms/tutorials/master-pages/control-id-naming-in-content-pages-cs


    Ricardo Minoru Makiyama


    • Editado RMinoru sexta-feira, 4 de outubro de 2013 20:09
    • Marcado como Resposta Rodrigo de Farias domingo, 6 de outubro de 2013 16:50
    sexta-feira, 4 de outubro de 2013 20:07
  • Rodrigo pelo ID você so consegue recuperar pelo cliente(lá no javascript, css). Para você recuperar pelo servidor(codeBehind) você so consegue pelo name do controle(ou inputs html). Como você está criando seus controles de forma padronizada "NomeControle + ID" fica fácil recuperar no codebehind. Como todo controle gerado tem "txtcampo" em seu nome, você pode usar o contains e recupearar valor.

    protected void Button1_Click(object sender, EventArgs e)
            {
                foreach (var item in Request.Form.AllKeys)
                {
                    if (item.Contains("txtCampo"))
                    {
                        var nomeControle = item;
                        var valorControle = Request[item];
                    }
                }
            }
    Apesar dele vim com aquele nome lá, você consegue separar eles dos outros controles que não são gerados dinamicamente. Caso ainda você precisa do nome "certin", do controle cria uma função que retorna o nome depois do caracter "$" no nome do controle.


    sexta-feira, 4 de outubro de 2013 23:27
    Moderador

Todas as Respostas

  • Olá,

    Tenta colocar seu ClientID dos controles como static, para resolver o problema dentro do contentPlaceholder as alterações de nomes.

    http://highoncoding.com/Articles/703_Understanding_ClientIDMode_Mode_Feature_in_ASP_net_4_0.aspx

    e para recuperar no servidor você pode tentar

    Request.Form.AllKeys

    para encontrar os nomes dos controles. A cada Key que você encontar e tiver parte do nome do seus controles, você recupera

    var c = Request[minhakey];

    sexta-feira, 4 de outubro de 2013 01:37
    Moderador
  • Rodrigo,

    Controles criados dinamicamente em páginas utilizando master page devem ser criados no evento Page_Init


    Ricardo Minoru Makiyama


    • Editado RMinoru sexta-feira, 4 de outubro de 2013 02:10
    sexta-feira, 4 de outubro de 2013 02:10
  • Iae Wellington li o artigo que você me mando e consegui remover o id do contentPlace Holder do ID dos TexBox porém se eu fizer Reques.Form.AllKeys ele me retorna o seguinte : ctl00$ContentPlaceHolder1$txtCampo1 que é o name do campo

    será que você conhece alguma que eu possa procurar o controle por id dele?


    Rodrigo de Farias

    sexta-feira, 4 de outubro de 2013 18:27
  • Rodrigo,

    Você pode utilizar o FindControl, segue a documentação:

    http://msdn.microsoft.com/pt-br/library/vstudio/486wc64h.aspx


    Ricardo Minoru Makiyama



    sexta-feira, 4 de outubro de 2013 19:21
  • Iae Ricardo beleza 

    Então estou usando o FindControl para acessar o TextBox que foi gerado dinamicamente, o código que usei para gera o TextBox foi o seguinte:

     if (dr.HasRows)
            {
    
                int count = 0;
    
    
    
                while (dr.Read())
                {
                    string campo = "Produto" + count.ToString();
    
                    TextBox campos = new TextBox();
                    campos.ClientIDMode = ClientIDMode.Static;
                    campos.Text = dr["DESCRICAO_PROD"].ToString();
                    campos.ID = "txtCampo" + dr["ID_DESCRICAO"].ToString();
                    PHContent.Controls.Add(campos);
                }
    
    
            }

    O código para acessar o ID do campos foi o seguinte:

      Control myControl = FindControl("ctl00$ContentPlaceHolder1$txtCampo1");
    
                if (myControl != null)
                {
                    Control myControl2 = myControl.Parent;
                    lblMsg.Text = "Parent of the textBox is : " + myControl2.ID + " And the ID of the first Control is " + myControl.ID;
                }
                else 
                {
                    lblMsg.Text = "Control not found";
                }

    Repare que o ID inserido no FindControl foi esse "ctl00$ContentPlaceHolder1$txtCampo1" se eu colocar o ID somente "txtCampo1" ele não encontra o textbox.

    Já coloque como o ContentPlaceHolder com "Static", mas parece que ele muda somente o ClienteID e não o ID pelo qual eu posso acessa-lo pelo code-behind

    Obrigado pela Atenção

     

    Rodrigo de Farias

    sexta-feira, 4 de outubro de 2013 19:41
  • Rodrigo,

    Vendo seu problema, encontrei um artigo que explica tudo o que você precisa saber para solucioná-lo utilizando exemplos para facilitar a compreensão:

    http://www.asp.net/web-forms/tutorials/master-pages/control-id-naming-in-content-pages-cs


    Ricardo Minoru Makiyama


    • Editado RMinoru sexta-feira, 4 de outubro de 2013 20:09
    • Marcado como Resposta Rodrigo de Farias domingo, 6 de outubro de 2013 16:50
    sexta-feira, 4 de outubro de 2013 20:07
  • Rodrigo pelo ID você so consegue recuperar pelo cliente(lá no javascript, css). Para você recuperar pelo servidor(codeBehind) você so consegue pelo name do controle(ou inputs html). Como você está criando seus controles de forma padronizada "NomeControle + ID" fica fácil recuperar no codebehind. Como todo controle gerado tem "txtcampo" em seu nome, você pode usar o contains e recupearar valor.

    protected void Button1_Click(object sender, EventArgs e)
            {
                foreach (var item in Request.Form.AllKeys)
                {
                    if (item.Contains("txtCampo"))
                    {
                        var nomeControle = item;
                        var valorControle = Request[item];
                    }
                }
            }
    Apesar dele vim com aquele nome lá, você consegue separar eles dos outros controles que não são gerados dinamicamente. Caso ainda você precisa do nome "certin", do controle cria uma função que retorna o nome depois do caracter "$" no nome do controle.


    sexta-feira, 4 de outubro de 2013 23:27
    Moderador
  • Wellington valeu cara funcionou direitinho

    Rodrigo de Farias

    domingo, 6 de outubro de 2013 16:50
  • cara ótimo artigo também resolveu meu problema além de ampliar meus conhecimento sobre master pages 

    obrigado!


    Rodrigo de Farias

    domingo, 6 de outubro de 2013 16:51