[WinForms - How To] Paginación del DataGridView

marzo 15, 2016 Christian Amado 0 Comentarios

Una grilla de datos nos ofrece una alternativa muy cómoda a la hora de mostrar datos. La funcionalidad común nos exige que la grilla vaya hasta abajo cuando se tienen múltiples registros, pero en ocasiones queremos mostrar cierta cantidad de registros y esta funcionalidad no se encuentra presente de manera estándar.

Reutilizando el mismo ejemplo de la importación de Excel a un DataGridView agregaremos la paginación a éste.
Básicamente agregamos 4 botones (Primero, anterior, siguiente, Último): Paginacion1

Luego agregamos un método que cargará los datos paginados:
private void button1_Click(object sender, EventArgs e)
{
    //Obtenemos el archivo desde la ubicación actual
    var executableFolderPath = Path.GetDirectoryName(Assembly.GetEntryAssembly().Location);

    //Hoja desde donde obtendremos los datos
    string hoja = "Hoja1";

    //Cadena de conexión
    string conexion = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + executableFolderPath +
                    "\\Registros.xlsx" +
                    ";Extended Properties='Excel 8.0;HDR=YES;';";
                        
    OleDbConnection con = new OleDbConnection(conexion);
    //Consulta contra la hoja de Excel
    OleDbCommand cmd = new OleDbCommand("Select * From [" + hoja + "$]", con);
    try
    {
        //Conectarse al archivo de Excel
        con.Open();

        sda = new OleDbDataAdapter(cmd);

        //Cargar todos los datos
        sda.Fill(data);
        total = data.Tables[0].Rows.Count;
        data.Clear();
                
        //Realizar la primera paginación
        sda.Fill(data, indice, 5, "Table");

        //Cargar la grilla
        dataGridView1.DataSource = data.Tables[0];
    }
    catch
    {
        //Error leyendo excel
        MessageBox.Show("Ocurrió un error en la lectura del archivo");
    }
    finally
    {
        //Funcione o no, cerramos la cadena de conexión
        con.Close();
    }
}

Para cada botón, se llama al método correspondiente y se pasa como parámetro los índices necesarios:
private void primero_Click(object sender, EventArgs e)
{
    indice = 0;
    data.Clear();
    sda.Fill(data, indice, 5, data.Tables[0].TableName);
}

private void anterior_Click(object sender, EventArgs e)
{
    indice -= 5;
    if (indice < 0)
        indice = 0;
            
    data.Clear();
    sda.Fill(data, indice, 5, "Table");
}

private void siguiente_Click(object sender, EventArgs e)
{             
    indice += 5;

    if (indice <= total)
    {
        data.Clear();
        sda.Fill(data, indice, 5, "Table");
    }
    else
        indice -= 5;
}

private void ultimo_Click(object sender, EventArgs e)
{
    indice = total -1;
    data.Clear();
    sda.Fill(data, indice, 5, "Table");
}

Nuestra grilla quedaría de la siguiente manera: Paginacion2

De esta manera hemos aplicado la paginación a la grilla en el formulario Windows.