Usuário com melhor resposta
GridView Updating Commad

Pergunta
-
Blz pessoal?
Estou com um problema que ja não sei mais o que pode ser... por isso estou aqui!
Eu tenho N formulários com GridView (Setores, Funcionários, Gestores...). O formulário de Setor e Período possui as mesmas características do Gestor, porém o setor e período não funciona como o do gestor. Vamos aos detalhes:
Na minha GridView SETOR estabeleço o seguinte código:
<asp:GridView ID="gv_setor" runat="server" AutoGenerateColumns="False" CellPadding="8" AllowPaging="True" DataKeyNames="id_setor" CssClass="GridPerson"> <HeaderStyle CssClass="headerGrid" /> <PagerSettings Mode="NumericFirstLast" /> <RowStyle CssClass="normalGrid" /> <AlternatingRowStyle CssClass="alternadoGrid" /> <FooterStyle CssClass="footerGrid" /> <PagerStyle CssClass="paginacaoGrid" HorizontalAlign="Center" /> <Columns> <asp:TemplateField Visible="false"> <ItemTemplate> <asp:Label Visible="false" ID="id_setor" runat="server"><%#DataBinder.Eval(Container.DataItem, "id_setor")%></asp:Label> </ItemTemplate> <EditItemTemplate> <asp:TextBox Visible="false" ID="txt_idSetor" runat="server" Text='<%#DataBinder.Eval(Container.DataItem, "id_setor")%>'></asp:TextBox> </EditItemTemplate> </asp:TemplateField> <asp:TemplateField HeaderText="Nome"> <ItemTemplate> <asp:Label ID="lbl_nomeSetor" runat="server"><%#DataBinder.Eval(Container.DataItem, "nome_setor")%></asp:Label> </ItemTemplate> <EditItemTemplate> <asp:TextBox ID="txt_nomeSetor" runat="server" Text='<%#DataBinder.Eval(Container.DataItem, "nome_setor")%>'></asp:TextBox> </EditItemTemplate> </asp:TemplateField> <asp:TemplateField HeaderText="Situação"> <ItemTemplate> <asp:Label ID="lbl_situacaoSetor" runat="server"><%#DataBinder.Eval(Container.DataItem, "status_setor")%></asp:Label> </ItemTemplate> <EditItemTemplate> <asp:DropDownList ID="ddl_statusSetor" runat="server"> <asp:ListItem Value="A" Text="Ativo"></asp:ListItem> <asp:ListItem Value="I" Text="Inativo"></asp:ListItem> </asp:DropDownList> </EditItemTemplate> </asp:TemplateField> <asp:CommandField ShowEditButton="True" /> <asp:TemplateField ShowHeader="False"> <ItemTemplate> <asp:LinkButton ID="LinkButton1" runat="server" CausesValidation="False" CommandName="Delete" Text="Delete" OnClientClick="javascript:return ConfirmaExclusao();"></asp:LinkButton> </ItemTemplate> </asp:TemplateField> </Columns> </asp:GridView>
E para popular o GridView eu tenho uma função local chamada PreencheGrid(); onde não acho necessário passar o código aqui neste momento.
O meu problema ocorre quando eu utilizo o evento RowUpdating para atualizar os dados da propria grid quando o usuário faz a mudança. No meu formulario GESTOR ele muda o status do gestor para ATIVO e INATIVO perfeitamente e ja exibe no mesmo instante no grid.
Se tratando do SETOR e PERIODO ocorre diferente. Ele atualiza apenas com o dado preenchido inicialmente no grid, o que faz após do RowEditing e RowUpdating ele ignora; sendo assim, ele atualiza o banco com os dados inicialmente exibido, não havendo alteração alguma. Testei a PROCEDURE que utilizo e funciona. O INTERESSANTE disso tudo, é que se eu coloco na GRIDVIEW que o valor do DROPDOWNLIST ddl_statusSetor for Text="Ativo" Value="I" ele atualiza o banco com o valor I.
Não sei o que pode estar ocorrendo... por isso estou pedindo ajuda!
Abaixo segue o código em VB.NET:
Protected Sub gv_setor_RowCancelingEdit(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewCancelEditEventArgs) Handles gv_setor.RowCancelingEdit Me.gv_setor.EditIndex = -1 PreencheGrid() End Sub
Protected Sub gv_setor_RowUpdating(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewUpdateEventArgs) Handles gv_setor.RowUpdating Dim comando As SqlCommand = New SqlCommand Dim TransacaoSQL As SqlTransaction = Nothing Try Dim valor As TextBox = gv_setor.Rows(e.RowIndex).FindControl("txt_idSetor") Dim valor_setor As TextBox = gv_setor.Rows(e.RowIndex).FindControl("txt_nomeSetor") Dim valor_status As DropDownList = gv_setor.Rows(e.RowIndex).FindControl("ddl_statusSetor") Dim id_setor As Integer = valor.Text Dim setor As String = valor_setor.Text Dim status As String = valor_status.SelectedValue comando.Connection = conexao comando.CommandType = CommandType.StoredProcedure comando.CommandText = "sp_AtualizaSetor" comando.Parameters.Add(New SqlParameter("@id_setor", id_setor)) comando.Parameters.Add(New SqlParameter("@nome_setor", setor)) comando.Parameters.Add(New SqlParameter("@status_setor", status)) conexao.Open() TransacaoSQL = conexao.BeginTransaction() comando.Transaction = TransacaoSQL comando.ExecuteNonQuery() TransacaoSQL.Commit() comando.Dispose() conexao.Close() Me.gv_setor.EditIndex = -1 PreencheGrid() Catch sqlEx As SqlException TransacaoSQL.Rollback() Throw ScriptManager.RegisterStartupScript(Page, Me.GetType(), "msgExcepSqlAtualizaSetor", "alert('Erro retornado pelo banco de dados ao atualizar setor.\n" & Replace(sqlEx.Message.ToString(), "'", "") & "');", True) Catch ex As Exception ScriptManager.RegisterStartupScript(Page, Me.GetType(), "msgExcepAtualizaSetor", "alert('Erro ao atualizar setor.\n" & Replace(ex.Message.ToString(), "'", "") & "');", True) End Try End Sub
Eu cheguei a exibir os valores antes do COMANDO.CONNECTION = CONEXAO com o seguinte comando:
MsgBox("ID Setor: " & id_setor & vbCrLf & "Nome Setor: " & setor & vbCrLf & "Status: " & status)
Ai que eu vi onde os dados editados pelo usuário não estava sendo exibidos.
O que posso fazer pra funcionar????
Agradeço a ajuda.
Lucas Araújo.
Respostas
-
Resolvi o problema da seguinte maneira:
Como eu tinha uma função PreencheGrid() e ela executava no Load da pagina, tive que estabelecer:
If Not IsPostBack Then PreencheGrid() End If
Lucas Araújo.- Marcado como Resposta LucasAraujo quinta-feira, 8 de julho de 2010 19:14