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;
}
}
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"]);
}
}
}
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";
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();
}
}
}
}
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");
}
}
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");
}
}
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"]);
}
}
}
Faça os testes finais, alterando os valores do GridView.
Disponibilizo para download o código fonte completo do projeto neste próprio post.