none
Problema con Paginacion de datagridview. RRS feed

  • Pregunta

  • Hola amigos de VB.NET,

    Tengo un problema con la paginación de un datagridview, en primera instancia me funciona perfecto, muestro los datos de una determinada tabla(Empleados cuyo total son 20) y le asigno el  numero de registros que quiero mostrar por pagina(Muestro 10 registros por pagina)  sin ningun  problema como se ve en la imagen #1

    , el problema radica cuando filtro los datos desde el textbox, por ejemplo cuando filtro todos los empleados que pertenecen al departamento de Recursos Humanos (4 en total) todavia se conversa "Pagina 1/2" y en realidad debe de aparecer "Pagina 1/1", y esto porque se estan filtrando solamente 4 registros, si la cantidad fuera mayor a 10, entonces seria valido.

    La paginacion la realizo desde un sp y en metodologia  4 capas. Este es mi codigo:

    --Listar Empleados con Paginacion 
    IF EXISTS(SELECT TOP 1 1 FROM sys.procedures WHERE name = 'sp_ListarEmpleados')
    	DROP PROCEDURE sp_ListarEmpleados
    GO
    CREATE PROCEDURE sp_ListarEmpleados 
    @RegistrosPorPagina INT,
    @NumeroPagina INT
     AS
    BEGIN
    	BEGIN TRY
    
    	SET NOCOUNT ON
        SELECT *  FROM EMPLEADO 
        ORDER BY  EMPLEADO.Cod_Empleado
    			 
        OFFSET (@NumeroPagina - 1) * @RegistrosPorPagina  ROWS
        FETCH NEXT @RegistrosPorPagina ROWS ONLY
    
        END TRY
    	BEGIN CATCH
    		EXEC sp_RetornarError
    	END CATCH
    END
    GO
    
    
    
    --CantidadPaginas 
    IF EXISTS(SELECT TOP 1 1 FROM sys.procedures WHERE name = 'sp_CantidadPaginas')
    	DROP PROCEDURE sp_CantidadPaginas
    GO
    CREATE PROCEDURE sp_CantidadPaginas
    @RegistrosPorPagina INT,
    @TotalPaginas INT OUTPUT
    AS
    DECLARE @CantidadFilas AS INT
    BEGIN
    SET NOCOUNT ON
    SET @CantidadFilas = (SELECT COUNT(EMPLEADO.id_funcionario) FROM EMPLEADO)
    SET @TotalPaginas = @CantidadFilas / @RegistrosPorPagina
    IF ((@CantidadFilas % @RegistrosPorPagina) > 0)
    BEGIN
    	SET @TotalPaginas = @TotalPaginas + 1
    	RETURN;
    END
    
    
    IF @TotalPaginas = 0
    BEGIN
    	SET @TotalPaginas = 1
    END
    END;

    En la aplicacion tengo el siguiente codigo:

    Capa datos:

        ''Funcion para Listar los Empleados
        Public Function ListarEmpleado(ByVal prRegistrosPorPagina As Integer, ByVal prNumeroPagina As Integer) As DataTable
            Dim datos As New DataTable
            Try
    
                cn = objconexion.Conectar
                Dim Da As New SqlDataAdapter("sp_ListarEmpleados", cn)
                Da.SelectCommand.CommandType = CommandType.StoredProcedure
                Da.SelectCommand.Parameters.AddWithValue("@RegistrosPorPagina", SqlDbType.Int).Value = prRegistrosPorPagina
                Da.SelectCommand.Parameters.AddWithValue("@NumeroPagina", SqlDbType.Int).Value = prNumeroPagina
                Da.Fill(datos)
                Da = Nothing
                Return datos
            Catch ex As Exception
                Throw
                If cn.State = ConnectionState.Open Then cn.Close()
                cn.Dispose()
                Return Nothing
            Finally
            End Try
        End Function
    
    
     'Cantidad de paginas a mostrar dependiendo del total de empleados
        Public Function CantidadPaginas(prRegistrosPorPagina As Integer)
            Dim TotalPaginas As Integer
    
            Try
    
                cn = objconexion.Conectar
                Dim cmd As New SqlCommand("sp_CantidadPaginas", cn)
                cmd.CommandType = CommandType.StoredProcedure
                cmd.Parameters.AddWithValue("@RegistrosPorPagina", prRegistrosPorPagina)
                cmd.Parameters.Add("@TotalPaginas", SqlDbType.Int)
                cmd.Parameters("@TotalPaginas").Direction = ParameterDirection.Output
    
                cn.Open()
                If cmd.ExecuteNonQuery Then
    
                    TotalPaginas = Convert.ToInt32(cmd.Parameters("@TotalPaginas").Value)
                    Return TotalPaginas
                Else
                    Return False
                End If
            Catch ex As Exception
                Throw
                If cn.State = ConnectionState.Open Then cn.Close()
                cn.Dispose()
            Finally
            End Try
    
        End Function

    En Capa Negocio:

    Imports CapaDatos
    Imports CapaEntidad
    Public Class CNEmpleado
    
        Dim objCapaDatos As New CDEmpleado
        
        Function ListarEmpleados(ByVal prRegistrosPorPagina As Integer, ByVal prNumeroPagina As Integer)
            Return objCapaDatos.ListarEmpleados(prRegistrosPorPagina, prNumeroPagina)
        End Function
    
        Function CantidadPaginas(prRegistrosPorPagina As Integer)
            Return objCapaDatos.CantidadPaginas(prRegistrosPorPagina)
        End Function
    
    End class
        

    En Presentacion

    Imports CapaNegocio
    
    
        Dim RegistrosporPagina As Integer = 10
        Dim NumeroPagina As Integer = 1
        Dim CantidadPaginas As Integer
        
        Dim objCapaNegocio As New CNEmpleado
        Dim dt As New DataTable
    
     Sub ListarRegistros()
    
            Try
    
                dt = objCapaNegocio.ListarEmpleados(RegistrosporPagina, NumeroPagina)
                GrillaEmpleados.AutoGenerateColumns = True
                GrillaEmpleados.DataSource = dt
                CantidadPaginas = objCapaNegocio.CantidadPaginas(RegistrosporPagina)
               Label_NumeroPagina.Text = String.Format("Pagina {0} de {1}", NumeroPagina, CantidadPaginas)
    
    Private Sub BtnAnterior_Click(sender As Object, e As EventArgs) Handles BtnAnterior.Click
    
            If NumeroPagina > 1 Then
                NumeroPagina = NumeroPagina - 1
                ListarRegistros()
            End If
        End Sub
    
    
    Private Sub BtnSiguiente_Click(sender As Object, e As EventArgs) Handles BtnSiguiente.Click
    
            CantidadPaginas = objCapaNegocio.CantidadPaginas(RegistrosporPagina)
            If NumeroPagina < CantidadPaginas Then
                NumeroPagina = NumeroPagina + 1
                ListarRegistros()
            End If
        End Sub
    
    
    Private Sub Form_GestionarEmpleado_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    ListarRegistros()
    End Sub
    Su ayuda me seria de gran utilidad, saludos.





    • Editado Jose Alrey domingo, 2 de octubre de 2016 3:53
    • Cambiado Enrique M. Montejo viernes, 7 de octubre de 2016 8:53 Pregunta relacionada con controles de Windows Forms.
    domingo, 2 de octubre de 2016 3:44