none
Capturar Valor da Grid para editar Registro em outra página RRS feed

  • Pergunta

  • Sou novato em asp .net então gostaria de saber se o procedimento que estou fazendo está correto ou é vicio do WinForms

    1° Tenho uma página com uma grid exibindo os Dados da tabela cliente:

                SqlConnection conexao = new SqlConnection(ConfigurationSettings.AppSettings["conexaoBD"]);
                SqlCommand comm = new SqlCommand("Select * from Clientes", conexao);
                conexao.Open();
                GridView1.DataSource = comm.ExecuteReader();
                GridView1.DataBind();
                conexao.Close();

    2° Adicionei uma coluna do Tipo Editar.

    3° Agora gostaria de pegar o valor da célula 1, onde está o código do cliente, e jogalo como parametro para editar os dados em outra pagina.

    4°  Segue codigo da passagem do parametro, escrito no evento RowEditing do grid:

                string cod = (Aqui gostaria de pegar o valor da célula 1 da grid);
                Context.Items.Add("codigo", cod);
                Server.Transfer("detalhes.aspx");

    5° Gostaria de saber se esta pratica esta correta, e como faço para pegar esse valor da grid.

    Obrigado
    quinta-feira, 11 de fevereiro de 2010 13:49

Respostas

  • olá,

    ao utilizar o Server.Tranfer você pode acessar os controles da paginá anterior através da propriedade PreviousPage. Quanto a utilização do contexto, para cada ciclo de vida de uma página será criado um contexto diferente, por isso o código postado não vai funcionar...

    espero ter ajudado,
    abraço!

    Default.aspx
    ...
    <form id="form1" runat="server">
        <asp:HiddenField ID="hddSelecionado" runat="server" />
        <asp:GridView ID="GridView1" runat="server" onrowcommand="GridView1_RowCommand">
            <Columns>
                <asp:CommandField ShowEditButton="True" />
            </Columns>
        </asp:GridView>
    </form>

    Default.aspx.cs
    ...
    protected void GridView1_RowCommand(object sender, GridViewCommandEventArgs e)
    {
        if (e.CommandName == "Edit")
        {
            hddSelecionado.Value = Convert.ToString(e.CommandArgument);
            Server.Transfer("~/Default2.aspx");
        }
    }

    Default2.aspx.cs
    public partial class Default2 : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            if (PreviousPage != null)
            {
                HiddenField Lhidden = (HiddenField)PreviousPage.FindControl("hddSelecionado");
                Response.Write(Lhidden.Value);
            }
        }
    }


    guilhermeando
    • Sugerido como Resposta Américo Arvani quinta-feira, 11 de fevereiro de 2010 18:45
    • Marcado como Resposta Harley Araujo quarta-feira, 17 de fevereiro de 2010 11:16
    quinta-feira, 11 de fevereiro de 2010 17:36
  • Olá Diego, tudo bom!?
    Sim isso é um pouco de vício do Windows Forms, rs... as coisas na Web são um pouco diferentes!

    A forma mais simples que eu vejo de fazer isso, é criando uma coluna HyperLink, cujo o link passa os paramêtros para outra página via QueryString.

    Vamos configurar algumas coisas pra facilitar a vida, há uma propriedade no GridView chamada "DataKeyNames", onde você determina os nomes dos campos que compoem a chave primária da tabela que esta sendo carregada no Grid. No código especifique da seguinte forma:

    GridView1.DataKeyNames = new string[] { "codigo" };
    Então inclua no seu grid um campo HyperLink, no código ficaria assim:

    <asp:HyperLinkField DataNavigateUrlFields="codigo" 
                        DataNavigateUrlFormatString="detalhes.aspx?codigo={0}" Text="Editar" />
    Essa coluna aparecerá com o link "Editar", e apontara para página de "detalhes.aspx" onde ele substitui o {0} na string pelo valor do campo codigo.
    Dai basta você tratar o evento Page_Load da página detalhes para pegar o código que você passou pela página do Grid:

    protected void Page_Load(object sender, EventArgs e)
    {
        string codigo = Request.QueryString["codigo"]; // ou
        int cod = (int)Request.QueryString["codigo"];
    }
    Espero que isso resolva!
    Obrigado.
    Rafael Veronezi
    Database Administrator | BI Analyst
    Twitter: ravero
    Blog: http://raver0.wordpress.com
    • Marcado como Resposta Harley Araujo quarta-feira, 17 de fevereiro de 2010 11:16
    quinta-feira, 11 de fevereiro de 2010 14:03
  • O que você pode fazer é gravar o código em Session então.
    Para isso coloque um LinkButton no seu GridView e defina nele as propriedade CommandName e CommandArgument, como no exemplo abaixo:

    <asp:GridView ID="gridView" runat="server">
        <Columns>
            <asp:TemplateField>
                <ItemTemplate>
                    <asp:LinkButton runat="server" CommandName="Editar" CommandArgument='<%Eval("codigo")%>' Text="Editar" />
                </ItemTemplate>
            </asp:TemplateField>
        </Columns>
    </asp:GridView>
    

    Então defina no evento OnRowCommand do GridView a parte que irá gravar o código em Session e redirecionar a outra página:

    protected void gridView_RowCommand(object sender, GridViewCommandEventArgs e) {
        if (e.CommandName == "Editar") {
            Session["codigo"] = e.CommandArgument;
            Response.Redirect("~/Detalhes.aspx");
        }
    }
    

    Então na página de edição (no exemplo, "Detalhes.aspx") é só carregar o código em Session:

    protected void Page_Load(object sender, EventArgs e) {
        int codigo = Session["codigo"];
        CarregarDadosParaEdicao(codigo);
    }
    


    É claro que é só um exemplo e tem que fazer o tratamento do valor carregado da Session para tentar converter para int etc.
    • Marcado como Resposta Harley Araujo quarta-feira, 17 de fevereiro de 2010 11:16
    quinta-feira, 11 de fevereiro de 2010 15:19

Todas as Respostas

  • Olá Diego, tudo bom!?
    Sim isso é um pouco de vício do Windows Forms, rs... as coisas na Web são um pouco diferentes!

    A forma mais simples que eu vejo de fazer isso, é criando uma coluna HyperLink, cujo o link passa os paramêtros para outra página via QueryString.

    Vamos configurar algumas coisas pra facilitar a vida, há uma propriedade no GridView chamada "DataKeyNames", onde você determina os nomes dos campos que compoem a chave primária da tabela que esta sendo carregada no Grid. No código especifique da seguinte forma:

    GridView1.DataKeyNames = new string[] { "codigo" };
    Então inclua no seu grid um campo HyperLink, no código ficaria assim:

    <asp:HyperLinkField DataNavigateUrlFields="codigo" 
                        DataNavigateUrlFormatString="detalhes.aspx?codigo={0}" Text="Editar" />
    Essa coluna aparecerá com o link "Editar", e apontara para página de "detalhes.aspx" onde ele substitui o {0} na string pelo valor do campo codigo.
    Dai basta você tratar o evento Page_Load da página detalhes para pegar o código que você passou pela página do Grid:

    protected void Page_Load(object sender, EventArgs e)
    {
        string codigo = Request.QueryString["codigo"]; // ou
        int cod = (int)Request.QueryString["codigo"];
    }
    Espero que isso resolva!
    Obrigado.
    Rafael Veronezi
    Database Administrator | BI Analyst
    Twitter: ravero
    Blog: http://raver0.wordpress.com
    • Marcado como Resposta Harley Araujo quarta-feira, 17 de fevereiro de 2010 11:16
    quinta-feira, 11 de fevereiro de 2010 14:03
  • Boa Rafael, obrigado pela dia

    Já tinha feito alguns exemplos assim, tava querendo mesmo é passar esse parametro por Context.


    Como eu faço isso?
    quinta-feira, 11 de fevereiro de 2010 14:18
  • O que você pode fazer é gravar o código em Session então.
    Para isso coloque um LinkButton no seu GridView e defina nele as propriedade CommandName e CommandArgument, como no exemplo abaixo:

    <asp:GridView ID="gridView" runat="server">
        <Columns>
            <asp:TemplateField>
                <ItemTemplate>
                    <asp:LinkButton runat="server" CommandName="Editar" CommandArgument='<%Eval("codigo")%>' Text="Editar" />
                </ItemTemplate>
            </asp:TemplateField>
        </Columns>
    </asp:GridView>
    

    Então defina no evento OnRowCommand do GridView a parte que irá gravar o código em Session e redirecionar a outra página:

    protected void gridView_RowCommand(object sender, GridViewCommandEventArgs e) {
        if (e.CommandName == "Editar") {
            Session["codigo"] = e.CommandArgument;
            Response.Redirect("~/Detalhes.aspx");
        }
    }
    

    Então na página de edição (no exemplo, "Detalhes.aspx") é só carregar o código em Session:

    protected void Page_Load(object sender, EventArgs e) {
        int codigo = Session["codigo"];
        CarregarDadosParaEdicao(codigo);
    }
    


    É claro que é só um exemplo e tem que fazer o tratamento do valor carregado da Session para tentar converter para int etc.
    • Marcado como Resposta Harley Araujo quarta-feira, 17 de fevereiro de 2010 11:16
    quinta-feira, 11 de fevereiro de 2010 15:19
  • olá,

    ao utilizar o Server.Tranfer você pode acessar os controles da paginá anterior através da propriedade PreviousPage. Quanto a utilização do contexto, para cada ciclo de vida de uma página será criado um contexto diferente, por isso o código postado não vai funcionar...

    espero ter ajudado,
    abraço!

    Default.aspx
    ...
    <form id="form1" runat="server">
        <asp:HiddenField ID="hddSelecionado" runat="server" />
        <asp:GridView ID="GridView1" runat="server" onrowcommand="GridView1_RowCommand">
            <Columns>
                <asp:CommandField ShowEditButton="True" />
            </Columns>
        </asp:GridView>
    </form>

    Default.aspx.cs
    ...
    protected void GridView1_RowCommand(object sender, GridViewCommandEventArgs e)
    {
        if (e.CommandName == "Edit")
        {
            hddSelecionado.Value = Convert.ToString(e.CommandArgument);
            Server.Transfer("~/Default2.aspx");
        }
    }

    Default2.aspx.cs
    public partial class Default2 : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            if (PreviousPage != null)
            {
                HiddenField Lhidden = (HiddenField)PreviousPage.FindControl("hddSelecionado");
                Response.Write(Lhidden.Value);
            }
        }
    }


    guilhermeando
    • Sugerido como Resposta Américo Arvani quinta-feira, 11 de fevereiro de 2010 18:45
    • Marcado como Resposta Harley Araujo quarta-feira, 17 de fevereiro de 2010 11:16
    quinta-feira, 11 de fevereiro de 2010 17:36