none
Obtendo valores dos textboxes de uma GridView C# RRS feed

  • Pergunta

  • Bom dia pessoal,

    É o seguinte: tenho ma gridview que monta textboxes atraves do itemtemplate.

    Essas caixas de texto são editáveis pelo usuário.

    Quero obter o valor que o usuário digitou mas não estou conseguindo, simplesmente vem vazio. 

    Já fiz de várias formas:

    1 - Varrendo a Grid. Um botão dispara essa varredura:

    foreach (GridViewRow row in grdUsuarioProjeto.Rows)
    {
      TextBox text = row.FindControl("txtDtIni") as TextBox ;
      text . Text <------------ VEM VAZIO
    }

    2 - Pelo evento OnSelectedIndexChanged da Grid. Defino um botao com CommandName="Select" e no acionamento do mesmo tento obter o valor:

     protected void grd_SelecionarRegistro(object sender, EventArgs e)
     {

    TextBox text = (TextBox)grdVinculaProjeto.SelectedRow.FindControl("txtDtFim");

     text . Text <------------ VEM VAZIO

     }

    No disparo desses botões a tela entra em postback e reconstroi a grid, causando a perda dos dados digitados nos campos de texto contidos nela.

    Alguem já passou por isso e teria alguma idéia ?

    Muito Obrigado.

    quarta-feira, 31 de outubro de 2012 12:04

Todas as Respostas

  • Você pode recuperar do request, utilizando o clientid do item.

    HttpContext.Current.Request(txtDtFim.ClientID)

    quarta-feira, 31 de outubro de 2012 12:20
  • Obrigado pela resposta.

    Esqueci de mencionar que essa minha grid está dentro de um UserControl.

    A tela que chama o UserControl conhece o txtDtFim? Porque ele é montado dinamicamente na grid.

    quarta-feira, 31 de outubro de 2012 12:31
  • Olá.

    Altere o metodo conforme mostrado abaixo:

    protected void grd_SelecionarRegistro(object sender, EventArgs e)
    {
      GridView grid = (GridView)sender;
      TextBox text = (TextBox)grid.SelectedRow.FindControl("txtDtFim");
      if (text != null)
      {
            var valorDigitado = text.Text;
      }
    }

    Abraços.


    Washington Luíz | MCP, MCTS
    O Senhor é minha força e somente Nele confio.

    quarta-feira, 31 de outubro de 2012 13:54
  • Valeu Washington pela resposta, mas já havia tentado isso e não funcionou. Retorna vazio.

    O grande problema é que quando eu aciono o botão de selecionar o registro eu entro no postback da página onde meu usercontrol está inserido e quando chego de fato ao método grd_SelecionarRegistro, meus textboxes recém digitados já estão vazios. 

    Não entendo porque a gridview é incapaz de manter suas informações. 

    quarta-feira, 31 de outubro de 2012 14:11
  • Opa... Vou fazer um teste aqui te te passo o resultado.

    Não havia reparado que seu Grid está em um UserControl. 


    Washington Luíz | MCP, MCTS
    O Senhor é minha força e somente Nele confio.

    quarta-feira, 31 de outubro de 2012 18:29
  • o que pode estar acontecendo é que o seu Page_Load esteja recarregando os dados do GridView e limpando os TextBox.

    protected void Page_Load(object sender, EventArgs e)
            {
                if (!this.IsPostBack)
                {
                    //Comandos
                }
            }


    quarta-feira, 31 de outubro de 2012 19:02
  • Exatamente.

    Não tenho o source desses campos, pois eles são criados vazios para serem digitados.

    Não existe Bind pra eles. O usuário digita um valor qualquer e na montagem da grid esses valores se perdem.

    Agora, eu nao esperava que isso fosse acontecer com o acionamento de um itemtemplate do tipo "select". Pra mim o .net deveria ser inteligente em guardar esses valores no postback da pagina.

    O estranho é que esse processo funciona na boa com aquele esquema de "edit", "update" que a gridview tem. Ou seja, o usuário clica em edit, a linha é ativada para edição, ou seja, tudo que é label, vira textbox, por exemplo, o usuário digita os novos valores e clica em "update".

    Funciona. Mas não é o meu caso, porque não quero nada carregando nos campos inicialmente.

    Vou ter que recorrer às gambiarras do hiddenField por javascript....

    quarta-feira, 31 de outubro de 2012 19:13
  • Olá StropS. Funcionou do mesmo jeito. Não sei como está sua implementação, mas segue o teste que fiz.

    Página Default.aspx:

    <%@ Register src="Controles/GridControl.ascx" tagname="GridControl" tagprefix="uc1" %>
    
    <asp:Content ID="BodyContent" runat="server" ContentPlaceHolderID="MainContent">
      <uc1:GridControl ID="GridControl1" runat="server" />
    </asp:Content>

    UserControl GridControl.ascx

    <asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False" 
        onselectedindexchanged="GridView1_SelectedIndexChanged">
        <Columns>
            <asp:TemplateField HeaderText="Histórico 3 últimos meses" ItemStyle-Width="400px">
                <ItemTemplate>
                    <asp:TextBox ID="txtDtFim" runat="server" MaxLength="5" Style="width: 50px;"></asp:TextBox>
                </ItemTemplate>
            </asp:TemplateField>
            <asp:CommandField ShowSelectButton="True" />
        </Columns>
    </asp:GridView>

    UserControl GridControl.ascx.cs

    public partial class GridControl : System.Web.UI.UserControl
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            if (!IsPostBack)
            {
                BindGrid();
            }
        }
    
        private void BindGrid()
        {
            var lista = new List<string>();
            for (int i = 1; i <= 10; i++)
            {
                lista.Add(i.ToString());
            }
    
            this.GridView1.DataSource = lista.ToList();
            this.GridView1.DataBind();
        }
    
        protected void GridView1_SelectedIndexChanged(object sender, EventArgs e)
        {
            GridView grid = (GridView)sender;
            TextBox text = (TextBox)grid.SelectedRow.FindControl("txtDtFim");
            if (text != null)
            {
                var valorDigitado = text.Text;
            }
        }
    }

    Abraços.


    Washington Luíz | MCP, MCTS
    O Senhor é minha força e somente Nele confio.

    quarta-feira, 31 de outubro de 2012 19:16
  • Valeu Washington!

    Vou testar aqui e ver se está assim no meu código.

    quarta-feira, 31 de outubro de 2012 19:22
  • Blz. Depois posta ae se funcionou ou não, ok?

    Abraços.


    Washington Luíz | MCP, MCTS
    O Senhor é minha força e somente Nele confio.

    quarta-feira, 31 de outubro de 2012 19:23
  • Ok, mas o que quero te dizer é que, tudo parte do html gerado na página, veja como a página ficou gerada, se você tentar ver qual id seus controles estão gerando, estas informações estão indo no request, e independente se os controles estão sendo limpos ou não, você terá acesso às informações.

    Mas é certo que, alguma coisa "no meio do caminho" está alterando o estado dos seus objetos, e isto as vezes dá trabalho depurar, mas tente o que te falei aí em cima.

    Boa sorte.

    quarta-feira, 31 de outubro de 2012 19:45