Olá pessoal, neste artigo será dado continuidade ao projeto criado para editar dados do GridView, em .NET, utilizando a linguagem C#. Acompanhem:

Já temos feito o carregamento dos dados e passagem via QueryString do ID do produto para a página de detalhes, onde é recuperado esse ID, feito uma consulta no banco e retornado os valores para os TextBoxes.

Adicione a esta página um botão, dando a ele o ID btnAlterarValores. Agora vá a página de códigos e crie uma variável que será a propriedade que irá armazenar o ID do produto, no momento em que essa página for chamada. Dessa forma utilizaremos o conceito de ViewState. A Listagem 01 ilustra a criação dessa propriedade.


public Int32 IdProduto
{
    get
    {
        if (ViewState["IdProduto"] != null)
            return Convert.ToInt32(ViewState["IdProduto"]);

        return 0;
    }
    set
    {
        ViewState["IdProduto"] = value;
    }
}
Listagem 01. Propriedade IdProduto, usando ViewState
Nota: Note que é usado o get e o set, já que a utilizo para retornar e atribuir valor.

Assim, conseguimos manter o valor do ID mesmo após a página sofrer um Postback. Altere o evento Load da página para que a propriedade criada receba o valor do ID, como ilustra a Listagem 02.


protected void Page_Load(object sender, EventArgs e)
{
    if (!Page.IsPostBack)
    {
        if (Request.QueryString["IdProduto"] != null)
        {
            this.CarregarDetalhesProduto(Convert.ToInt32(Request.QueryString["IdProduto"]));
            this.IdProduto = Convert.ToInt32(Request.QueryString["IdProduto"]);
        }
    }
}
Listagem 02. Evento Page Load

Agora é necessário criar o método para atualizar os dados no banco. Para isso vá a classe Produtos e crie uma variável que irá conter a instrução de UPDATE, ilustrado na Listagem 03.


public string strUpdate = "UPDATE Products SET " + 
  " ProductName = @ProductName, UnitPrice = @UnitPrice, " + 
  " UnitsInStock = @UnitsInStock " + 
  " WHERE ProductID = @ProductID";
Listagem 03. Instrução SQL de Update

A Listagem 04 ilustra o método para atualizar os dados.


public void AtualizarValores(ModeloProdutos objModelo)
{
    using (objConexao = new SqlConnection(strStringConexao))
    {
        using (objCommand = new SqlCommand(strUpdate, objConexao))
        {
            try
            {
                objConexao.Open();
                objCommand.Parameters.AddWithValue("@ProductID", objModelo.ProductID);
                objCommand.Parameters.AddWithValue("@ProductName", objModelo.ProductName);
                objCommand.Parameters.AddWithValue("@UnitPrice", objModelo.UnitPrice);
                objCommand.Parameters.AddWithValue("@UnitsInStock", objModelo.UnitsInStock);
                objCommand.ExecuteNonQuery();
            }
            catch (Exception ex)
            {
                throw new Exception(ex.Message);
            }
            finally
            {
                objConexao.Close();
            }
        }
    }
}
Listagem 04. Método AtualizarValores
Nota: Note que é utilizado ações comuns ao se trabalhar com banco de dados utilizando a tecnologia ADO.NET.

Voltando a página de detalhes, adicione um botão para alterar os valores e, no evento click dele, adicione a codificação da Listagem 05.


protected void btnAlterarValores_Click(object sender, EventArgs e)
{
    if (!String.IsNullOrEmpty(txtProduto.Text))
    {
        var classe = new Produtos();
        var modelo = new Produtos.ModeloProdutos();
        modelo.ProductID = this.IdProduto;
        modelo.ProductName = txtProduto.Text;
        modelo.UnitPrice = Convert.ToDecimal(txtPrecoUnitario.Text);
        modelo.UnitsInStock = Convert.ToInt16(txtUnidadesEstoque.Text);
        classe.AtualizarValores(modelo);
        Response.Redirect("Produtos.aspx");
    }
}
Listagem 05. Evento click do botão
Nota: Note que é verificado se o valor do textbox de produto é diferente de nulo ou vazio. Isto porque na tabela Products, do Northwind, essa coluna é de preenchimento obrigatório. Após isso é atribuído os valores dos controles aos valores da variável modelo, que é uma instância da classe ModeloProdutos, que é passada como parâmetro para o método criado na Listagem 04. Ao final é feito um redirecionamento a página de Produtos.

Faça os testes atualizando os registros do Grid.

Na página de Produtos o ID do produto clicado é passado via QueryString para a página de Detalhes. Outra forma de fazermos isso é utilizando a Session . Assim não passamos nada na URL, além do necessário.

Para fazermos isso é simples, vá à página de Produtos e altere o evento RowCommand, como ilustrado na Listagem 06.


protected void grdDados_RowCommand(object sender, GridViewCommandEventArgs e)
{
    if (e.CommandName.Equals("Editar"))
    {
        Session.Add("IdProduto", e.CommandArgument.ToString());
        this.Response.Redirect("DetalheProduto.aspx");
    }
}
Listagem 06. Utilizando Session para armazenar o ID do produto clicado

Para finalizarmos é necessário que seja feita a alteração na página de Detalhes, no evento Page Load, já que não pegaremos mais o valor da QueryString. A Listagem 07 ilustra como fazer isso.


protected void Page_Load(object sender, EventArgs e)
{
    if (!Page.IsPostBack)
    {
        if (Session["IdProduto"] != null)
        {
            this.CarregarDetalhesProduto(Convert.ToInt32(Session["IdProduto"]));
            this.IdProduto = Convert.ToInt32(Session["IdProduto"]);
        }
    }
}
Listagem 07. Recuperando o ID da Session

Faça os testes finais, alterando os valores do GridView.

Disponibilizo para download o código fonte completo do projeto neste próprio post.