none
GridView Updating Commad RRS feed

  • 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.
    quinta-feira, 8 de julho de 2010 15:24

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
    quinta-feira, 8 de julho de 2010 19:14