none
Pegar valor Texbox dinamicamente RRS feed

  • Pergunta

  • Estou gerando em um Repeater Texbox dinamicamente, o problema esta sendo para pegar os valores dos textbox, sempre quando clico no botão os Textbox somem, alguém sabe o porque?

    O projeto esta no framework 2.0

    segue o código

            <asp:DropDownList ID="ddlProjetos" runat="server" OnSelectedIndexChanged="ddlProjetos_SelectedIndexChanged">
            </asp:DropDownList>
    
            <asp:Repeater ID="rpItens" runat="server" OnItemDataBound="rpItens_ItemDataBound">
                <ItemTemplate>
                    <div class='contentForm' style='width:30%'>
                        <p><%# Eval("Nome") %></p>
                        <asp:PlaceHolder id="phItem" runat="server">
                        </asp:PlaceHolder>
                    </div>
                </ItemTemplate>            
            </asp:Repeater> 
    protected void ddlProjetos_SelectedIndexChanged(object sender, EventArgs e)
            {
                GeraCampos g = new GeraCampos();
                rpItens.DataSource = g.GeraCampos2();
                rpItens.DataBind();    
            }
    
            protected void rpItens_ItemDataBound(object sender, RepeaterItemEventArgs e)
            {
                if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem) 
                {
                    CustomControls c = (CustomControls)e.Item.DataItem;
                    PlaceHolder ph = (PlaceHolder)e.Item.FindControl("phItem");
    
                    TextBox tb = new TextBox();
                    tb.ID = c.Codigo.ToString();
                    tb.ToolTip = c.Nome;
    
                    ph.Controls.Add(tb);
                }
            }

    Pagar pegar os valores

    protected void Button1_Click(object sender, EventArgs e)
            {
                string text = string.Empty;
    
                for (int i = 0; i < rpItens.Items.Count; i++)
                {
                    dynamic dyn = rpItens.Items[i].FindControl(codigo);
    
                    if (dyn is TextBox)
                    {
                        text = ((TextBox)dyn).Text;
                        break;
                    }               
                }
                
                Label1.Text = text;
            }

    segunda-feira, 22 de outubro de 2012 10:22

Respostas

  • Pedro

    eu consegui fazer, 

    mas precisei mudar algumas coisas

    Primeiro eu mudei o HTML

    <asp:Repeater ID="rpItens" runat="server" OnItemDataBound="rpItens_ItemDataBound">
                <ItemTemplate>
                    <div class='contentForm' style='width: 30%'>
                        <p>
                            <%# Eval("Nome") %></p>
                        <asp:TextBox ID="txt" runat="server" Visible="false" onblur="regatarValor(this.value, this.id);"  />
                        <asp:HiddenField ID="valor" runat="server" />
                        <asp:HiddenField ID="cod" runat="server" />
                        <asp:DropDownList ID="ddl" runat="server" Visible="false" />
                    </div>
                </ItemTemplate>
            </asp:Repeater>

    repare que eu tirei o PlaceHolder

    Depois modifiquei o método [rpItens_ItemDataBound]

    if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
                {
                    Campos item = (Campos)e.Item.DataItem;
    
                    TextBox txt = (TextBox)e.Item.FindControl("txt");
                    DropDownList ddl = (DropDownList)e.Item.FindControl("ddl");
                    HiddenField hdn = (HiddenField)e.Item.FindControl("cod");
    
                    if (item.Tipo == 1)
                    {
                        txt.ID = item.Id.ToString();
                        hdn.Value = item.Id.ToString();
                     
                        txt.Visible = true;
                        
                    }
                    else if (item.Tipo == 2)
                    {
                        ddl.ToolTip = item.Nome;
                        hdn.Value = item.Id.ToString();
    
                        ddl.Visible = true;
                    }
    
                }

    o evento de click no button ficou

    string text = string.Empty;
                string codigo = string.Empty;
    
                for (int i = 0; i < rpItens.Items.Count; i++)
                {
                    TextBox txt = (TextBox)rpItens.Items[i].Controls[1];
                    HiddenField valor = (HiddenField)rpItens.Items[i].Controls[3];
                    HiddenField cod = (HiddenField)rpItens.Items[i].Controls[5];
                    DropDownList ddl = (DropDownList)rpItens.Items[i].Controls[7];
    
                    if (txt.Visible)
                    {
                        text = valor.Value;
                        codigo = cod.Value;
                    }
                    else
                    {
                        //text = ddl.SelectedItem.Text;
                        codigo = cod.Value;
    
                    }                
                }
    
                TextBox1.Text = text;

    por ultimo criei um método javascript

    <script type="text/javascript">
            function regatarValor(valor, id) {
                id = id.replace("_", "$");
                id = id.replace("_", "#");
                id = id.substring(0, id.indexOf("#"));
                id += "$valor";
    
                document.getElementById(id).value = valor;
            }
        </script>

    veja se isso atende ao que você precisa


    Bruno Viegas D. Ribeiro

    Analista Desenvolvedor de Sistemas
    www.brunoviegas.com.br
     

    • Marcado como Resposta Pedro Ogm quinta-feira, 25 de outubro de 2012 13:50
    quarta-feira, 24 de outubro de 2012 16:21
  • Agora deu certo Bruno, mudei a função javascript, ficou assim

            function regatarValor(valor, id) {
                id2 = id.length;
                id3 = id2 - 28;
                id4 = id.substr(28, id3);
                id = id.replace(id4, "");            
                id += "valor";     
                document.getElementById(id).value = valor;                              
            }

    Valeu pela ajuda

    • Marcado como Resposta Pedro Ogm quinta-feira, 25 de outubro de 2012 13:50
    quinta-feira, 25 de outubro de 2012 13:50

Todas as Respostas

  • Pedro,

    Esta o método Page_Load?


    Bruno Viegas D. Ribeiro

    Analista Desenvolvedor de Sistemas
    www.brunoviegas.com.br
     

    segunda-feira, 22 de outubro de 2012 10:23
  • Não tem nada no Page_Load
    segunda-feira, 22 de outubro de 2012 10:28
  • Quando clico no button, todos os textbox somem, apenas os Eval do Nome que permanece na página

    <p><%# Eval("Nome") %></p>

    segunda-feira, 22 de outubro de 2012 10:32
  • Ok, 

    Como você carrega o seu DropDownList?


    Bruno Viegas D. Ribeiro

    Analista Desenvolvedor de Sistemas
    www.brunoviegas.com.br
     

    segunda-feira, 22 de outubro de 2012 10:32
  • Com SqlDataSource, eu postei o código aspx faltando essa parte 

    segunda-feira, 22 de outubro de 2012 10:44
  • ops,

    falto o código

            <asp:DropDownList ID="DropDownList1" DataTextField="Nome" 
                                DataValueField="Codigo" DataSourceID="SqlDataSource1" runat="server"
                                OnSelectedIndexChanged="ddlProjetos_SelectedIndexChanged">
            </asp:DropDownList>

    segunda-feira, 22 de outubro de 2012 10:44
  • Pedro,

    Simulei seu ambiente na minha maquina e consegui resolver da seguinte forma

    1º - Modifiquei o HTML, Ficando

    <asp:Repeater ID="rpItens" runat="server" OnItemDataBound="rpItens_ItemDataBound">
                <ItemTemplate>
                    <div class='contentForm' style='width: 30%'>
                        <p>
                            <%# Eval("Nome") %></p>
                        <asp:PlaceHolder ID="phItem" runat="server">
                            <asp:TextBox ID="txt" runat="server" />
                        </asp:PlaceHolder>
                    </div>
                </ItemTemplate>
            </asp:Repeater>

    2º - Modifiquei o método ItemDataBound, Ficando

    Campos c = (Campos)e.Item.DataItem;
                    PlaceHolder ph = (PlaceHolder)e.Item.FindControl("phItem");
    
                    TextBox tb = (TextBox)e.Item.FindControl("txt");
                    tb.ClientIDMode = System.Web.UI.ClientIDMode.Static;
                    //TextBox tb = new TextBox();
                    tb.ID = c.Id.ToString();
                    tb.ToolTip = c.Nome;
    
                    ph.Controls.Add(tb);

    Assim Funcionou.

    Obs.: A Classe Campo eu criei apenas para simular, troque pela Classe que já usa


    Bruno Viegas D. Ribeiro

    Analista Desenvolvedor de Sistemas
    www.brunoviegas.com.br
     

    segunda-feira, 22 de outubro de 2012 10:58
  • Eu vo testa depois posto o resultado

    essa linha eu não consigo usar, no framework 2.0 não tem isso

    tb.ClientIDMode = System.Web.UI.ClientIDMode.Static;
    segunda-feira, 22 de outubro de 2012 11:09
  • Agora não perco mais o Textbox Bruno, deu certo da sua forma, valeu, mais ainda tenho 2 problemas

    o Primeiro é que não to conseguindo pegar o valor dos Textbox, como disse eu estou usando o framework 2.0 e os textbox não tem o atributo ClientIDMode para travar os Ids

    o Segundo é que dependendo da busca eu preciso criar um Dropdownlist ao invés do Textbox

    segunda-feira, 22 de outubro de 2012 13:31
  • Alguém pode me ajudar nessa dúvida?
    terça-feira, 23 de outubro de 2012 16:06
  • Estou quase resolvendo esse problema, ainda tenho o seguinte problema, quando clico no botão para pegar os valores dos Textbox na primeira vez eu não consigo pegar nenhum valor, porém na segunda tentativa eu consigo pegar esses valores, segue o código

    <asp:Repeater runat="server" ID="rpItens" OnItemDataBound="rpItens_ItemDataBound"> <ItemTemplate> <p><%# Eval("Nome") %></p> <asp:HiddenField ID="hfValor" Value='<%# Eval("UID") %>' runat="server" /> <asp:PlaceHolder ID="ph" runat="server"> <asp:TextBox ID="txt" ToolTip='<%# Eval("Descricao") %>' runat="server" /> </asp:PlaceHolder> </ItemTemplate> </asp:Repeater>

    <asp:Button ID="Button1" runat="server" Text="Mostra Valores" onclick="Button1_Click" /> 


    protected void Button1_Click(object sender, EventArgs e)
            {
                string text = string.Empty;
                
                for (int i = 0; i < rpItens.Items.Count; i++)
                {
                    PlaceHolder phItens = (PlaceHolder)rpItens.Items[i].FindControl("ph");
                    HiddenField hfFase = (HiddenField)rpItens.Items[i].FindControl("hfValor");
    
                    string codigoFase = hfFase.Value;
    
                    if (phItens.HasControls())
                    {
                        foreach (Control ctr in phItens.Controls)
                        {
                            if (ctr is TextBox)
                            {
                                text = ((TextBox)ctr).Text;
                            }
                        }
                    }                
                }
    
                return text;
            }

    quarta-feira, 24 de outubro de 2012 10:13
  • Pedro, 

    Eu estava tentando resolver se problema e consegui pelo menos o segundo

    Olhe o que eu fiz

    html

     <asp:PlaceHolder ID="phItem" runat="server">
                            <asp:TextBox ID="txt" runat="server" Visible="false" />
                            <asp:DropDownList ID="ddl" runat="server" Visible="false" />
                        </asp:PlaceHolder>

    e o CS

     if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
                {
                    Campos item = (Campos)e.Item.DataItem;
    
                    PlaceHolder phl = (PlaceHolder)e.Item.FindControl("phItem");
                    TextBox txt = (TextBox)e.Item.FindControl("txt");
                    DropDownList ddl = (DropDownList)e.Item.FindControl("ddl");
    
                    if (item.Tipo == 1)
                    {
                        txt.ID = item.Id.ToString();
                        txt.ToolTip = item.Nome;
    
                        txt.Visible = true;
                        
                    }
                    else if (item.Tipo == 2)
                    {
                        ddl.ID = item.Id.ToString();
                        ddl.ToolTip = item.Nome;
    
                        ddl.Visible = true;
                    }
    
                }

    agora estou tentando uma maneira de resolver o primeiro

    Tire uma duvida, você só quer pegar o valor de apenas 1 textbox? ou de todos?


    Bruno Viegas D. Ribeiro

    Analista Desenvolvedor de Sistemas
    www.brunoviegas.com.br
     

    quarta-feira, 24 de outubro de 2012 10:42
  • Fala Bruno, 

    Preciso pegar de todos os Textbox ou Dropdown da página

    quarta-feira, 24 de outubro de 2012 14:47
  • Então se você precisa de todos, o código dele é importante ou não?

    Bruno Viegas D. Ribeiro

    Analista Desenvolvedor de Sistemas
    www.brunoviegas.com.br
     

    quarta-feira, 24 de outubro de 2012 15:18
  • sim, preciso do código para fazer o insert no banco
    quarta-feira, 24 de outubro de 2012 15:23
  • Pedro

    eu consegui fazer, 

    mas precisei mudar algumas coisas

    Primeiro eu mudei o HTML

    <asp:Repeater ID="rpItens" runat="server" OnItemDataBound="rpItens_ItemDataBound">
                <ItemTemplate>
                    <div class='contentForm' style='width: 30%'>
                        <p>
                            <%# Eval("Nome") %></p>
                        <asp:TextBox ID="txt" runat="server" Visible="false" onblur="regatarValor(this.value, this.id);"  />
                        <asp:HiddenField ID="valor" runat="server" />
                        <asp:HiddenField ID="cod" runat="server" />
                        <asp:DropDownList ID="ddl" runat="server" Visible="false" />
                    </div>
                </ItemTemplate>
            </asp:Repeater>

    repare que eu tirei o PlaceHolder

    Depois modifiquei o método [rpItens_ItemDataBound]

    if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
                {
                    Campos item = (Campos)e.Item.DataItem;
    
                    TextBox txt = (TextBox)e.Item.FindControl("txt");
                    DropDownList ddl = (DropDownList)e.Item.FindControl("ddl");
                    HiddenField hdn = (HiddenField)e.Item.FindControl("cod");
    
                    if (item.Tipo == 1)
                    {
                        txt.ID = item.Id.ToString();
                        hdn.Value = item.Id.ToString();
                     
                        txt.Visible = true;
                        
                    }
                    else if (item.Tipo == 2)
                    {
                        ddl.ToolTip = item.Nome;
                        hdn.Value = item.Id.ToString();
    
                        ddl.Visible = true;
                    }
    
                }

    o evento de click no button ficou

    string text = string.Empty;
                string codigo = string.Empty;
    
                for (int i = 0; i < rpItens.Items.Count; i++)
                {
                    TextBox txt = (TextBox)rpItens.Items[i].Controls[1];
                    HiddenField valor = (HiddenField)rpItens.Items[i].Controls[3];
                    HiddenField cod = (HiddenField)rpItens.Items[i].Controls[5];
                    DropDownList ddl = (DropDownList)rpItens.Items[i].Controls[7];
    
                    if (txt.Visible)
                    {
                        text = valor.Value;
                        codigo = cod.Value;
                    }
                    else
                    {
                        //text = ddl.SelectedItem.Text;
                        codigo = cod.Value;
    
                    }                
                }
    
                TextBox1.Text = text;

    por ultimo criei um método javascript

    <script type="text/javascript">
            function regatarValor(valor, id) {
                id = id.replace("_", "$");
                id = id.replace("_", "#");
                id = id.substring(0, id.indexOf("#"));
                id += "$valor";
    
                document.getElementById(id).value = valor;
            }
        </script>

    veja se isso atende ao que você precisa


    Bruno Viegas D. Ribeiro

    Analista Desenvolvedor de Sistemas
    www.brunoviegas.com.br
     

    • Marcado como Resposta Pedro Ogm quinta-feira, 25 de outubro de 2012 13:50
    quarta-feira, 24 de outubro de 2012 16:21
  • Então Bruno, ainda não deu certo, eu to conseguindo pegar esses valores depois da segunda tentativa só
    quinta-feira, 25 de outubro de 2012 11:32
  •  para isso mesmo que criei a função javascript, to que é digitado ela joga dentro do HiddenField e você consegue pegar já na primeira vez

    Bruno Viegas D. Ribeiro

    Analista Desenvolvedor de Sistemas
    www.brunoviegas.com.br
     

    quinta-feira, 25 de outubro de 2012 11:37
  • Agora deu certo Bruno, mudei a função javascript, ficou assim

            function regatarValor(valor, id) {
                id2 = id.length;
                id3 = id2 - 28;
                id4 = id.substr(28, id3);
                id = id.replace(id4, "");            
                id += "valor";     
                document.getElementById(id).value = valor;                              
            }

    Valeu pela ajuda

    • Marcado como Resposta Pedro Ogm quinta-feira, 25 de outubro de 2012 13:50
    quinta-feira, 25 de outubro de 2012 13:50