Saltar al contenido

Pegar datos de Excel en un DataGridView en blanco: excepción de índice fuera de rango

Luego de de una larga selección de datos hemos podido resolver este enigma que presentan ciertos de nuestros lectores. Te regalamos la respuesta y esperamos que resulte de gran apoyo.

Solución:

Después de investigar un poco, descubrí que primero tengo que agregar columnas, luego agregar una nueva fila, obtener el índice de fila de la fila recién creada y luego establecer los valores de celda.

Aquí está el código actualizado:

DataObject o = (DataObject)Clipboard.GetDataObject();
if (o.GetDataPresent(DataFormats.Text))

    if (myDataGridView.RowCount > 0)
        myDataGridView.Rows.Clear();

    if (myDataGridView.ColumnCount > 0)
        myDataGridView.Columns.Clear();

    bool columnsAdded = false;
    string[] pastedRows = Regex.Split(o.GetData(DataFormats.Text).ToString().TrimEnd("rn".ToCharArray()), "rn");
    foreach (string pastedRow in pastedRows)
    
        string[] pastedRowCells = pastedRow.Split(new char[]  't' );

        if (!columnsAdded)
        
            for (int i = 0; i < pastedRowCells.Length; i++)
                myDataGridView.Columns.Add("col" + i, pastedRowCells[i]);

            columnsAdded = true;
            continue;
        

        myDataGridView.Rows.Add();
        int myRowIndex = myDataGridView.Rows.Count - 1;

        using (DataGridViewRow myDataGridViewRow = myDataGridView.Rows[myRowIndex])
        
            for (int i = 0; i < pastedRowCells.Length; i++)
                myDataGridViewRow.Cells[i].Value = pastedRowCells[i];
        
    

}

Y aquí está funcionando:

ingrese la descripción de la imagen aquí

Feliz de aceptar críticas y consejos útiles para mejorar esto. Este código es bastante lento...

Sé que es algunos años después, pero estaba buscando una solución para este problema y encontré la modificación de BASA del código de Latheesan. Solo funcionó parcialmente, por lo que al modificarlo, me gustaría agregar esta solución para futuros navegadores:

private void Paste(DataGridView d)
    
        DataObject o = (DataObject)Clipboard.GetDataObject();
        if (o.GetDataPresent(DataFormats.StringFormat))
        
            string[] pastedRows = Regex.Split(o.GetData(DataFormats.StringFormat).ToString().TrimEnd("rn".ToCharArray()), "r");
            int j = 0;
            try  j = d.CurrentRow.Index;  catch  
            foreach (string pastedRow in pastedRows)
            
                DataGridViewRow r = new DataGridViewRow();
                r.CreateCells(d, pastedRow.Split(new char[]  't' ));
                d.Rows.Insert(j, r);
                j++;
            
        
    

Código perfecto aquí: (escribir en el botón)

DataObject o = (DataObject)Clipboard.GetDataObject();
if (o.GetDataPresent(DataFormats.Text))

    if (myDataGridView.RowCount > 0)
        myDataGridView.Rows.Clear();

    if (myDataGridView.ColumnCount > 0)
        myDataGridView.Columns.Clear();

    bool columnsAdded = false;
    string[] pastedRows = Regex.Split(o.GetData(DataFormats.Text).ToString().TrimEnd("rn".ToCharArray()), "rn");
    int j=0;
    foreach (string pastedRow in pastedRows)
    
        string[] pastedRowCells = pastedRow.Split(new char[]  't' );

        if (!columnsAdded)
        
            for (int i = 0; i < pastedRowCells.Length; i++)
                myDataGridView.Columns.Add("col" + i, pastedRowCells[i]);

            columnsAdded = true;
            continue;
        

        myDataGridView.Rows.Add();
        int myRowIndex = myDataGridView.Rows.Count - 1;

        using (DataGridViewRow myDataGridViewRow = myDataGridView.Rows[j])
        
            for (int i = 0; i < pastedRowCells.Length; i++)
                myDataGridViewRow.Cells[i].Value = pastedRowCells[i];
        
        j++;
    

Modificado del código de Latheesan.

Aquí tienes las reseñas y puntuaciones

Ten en cuenta recomendar esta sección si te valió la pena.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *