Usuário com melhor resposta
Pegar valor Texbox dinamicamente

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; }
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
-
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
Todas as Respostas
-
Pedro,
Esta o método Page_Load?
Bruno Viegas D. Ribeiro
Analista Desenvolvedor de Sistemas www.brunoviegas.com.br -
-
-
Ok,
Como você carrega o seu DropDownList?
Bruno Viegas D. Ribeiro
Analista Desenvolvedor de Sistemas www.brunoviegas.com.br -
-
-
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 -
-
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
-
-
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; }
-
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 -
-
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 -
-
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
-
-
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 -
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