2012-04-11 9 views
7

Estoy trabajando en una aplicación C# que contiene una gran cantidad de DataGridViews que están vacías. El usuario tiene que llenarlos con datos copiados/pegados de Excel. Lo que hago es la siguiente:Datagridview.SelectedCells pedido

int i = 0; 
string s = Clipboard.GetText(); 

// Separate lines 
string[] lines = Regex.Split(s, "\r\n"); 
foreach (string line in lines) 
{ 
    // Separate each cell 
    string[] cells = line.Split('\t'); 
    foreach (string cell in cells) 
    { 
     // If we selected as many cells as copied 
     if (dataGridView.SelectedCells.Count == (lines.Length-1)*(cells.Length)) 
     { 
      dataGridView.SelectedCells[i].Value = cell; 
      i++; 
     } 
    } 
} 

El problema es que si copio algo como esto (en Excel):

1 2 3 
4 5 6 

Mi DataGridView será parecida:

6 4 2 
5 3 1 

I realmente no sé qué hacer para arreglar esto ... Gracias de antemano

+0

¿Existe la posibilidad de que pueda crear una tabla de datos con la matriz de celdas y vincular los datos a la cuadrícula de datos? – ray

+0

@RayMoonDay No sé si es una buena solución teniendo en cuenta que tengo como 50 cuadrículas generadas dinámicamente, no estoy realmente en el uso de la memoria, así que no sé si es tan grande o no. Voy a probar esto de todos modos, gracias. – Blowi

+0

¿Por qué es posible que necesite dinámicamente generar 50 cuadrículas vacías? Sin embargo, si pudieras simplemente imprimir la variable 's' que es una copia del portapapeles, puedes hacerte una idea si t coincide con tu salida o con el orden real de datos de Excel – ray

Respuesta

1

Reemplazar

dataGridView.SelectedCells[i].Value = cell;

con

dataGridView.SelectedCells[(dataGridView.SelectedCells.Count-1) - i].Value = cell;

+0

Esta es una solución realmente simple porque si selecciono desde la esquina inferior derecha hasta arriba a la izquierda no funcionará. De todos modos el usuario tendrá que cuidar, gracias :) – Blowi

2
  1. convertir sus datos del portapapeles a una matriz de 2 dimensiones. Recuerde la longitud de cada dimensión.
  2. Examine las celdas seleccionadas y encuentre las celdas superior izquierda e inferior derecha. De eso puedes determinar que es del tamaño correcto.
  3. Utilizando un bucle doble, asigne los datos del portapapeles desde la posición de la matriz directamente a la coordenada de la celda (sin usar las celdas seleccionadas) usando la coordenada de la celda de topleft como un desplazamiento.

De forma alternativa, en lugar de una matriz bidimensional, puede crear una Lista de una pequeña clase/estructura que contenga las propiedades Fila, Col y Valor. A continuación, simplemente itere a través de eso en lugar de hacerlo en el bucle doble.

+0

Pensé en eso y en realidad lo intenté (pero al revés, ordenando las celdas seleccionadas en una lista y bucleando), gracias también :) – Blowi