2012-04-11 8 views
7

Sto lavorando a un'applicazione C# che contiene un sacco di DataGridViews che sono vuote. L'utente deve riempirli con copia/dati incollati da Excel. Quello che faccio è la seguente:Datagridview.SelectedCells order

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++; 
     } 
    } 
} 

Il problema è che se copio qualcosa di simile (in excel):

1 2 3 
4 5 6 

mio datagridview sarà simile:

6 4 2 
5 3 1 

I non so davvero cosa fare per risolvere questo ... Grazie in anticipo

+0

Qualche possibilità è possibile creare un datatable con l'array di celle e associare i dati al datagrid? – ray

+0

@RayMoonDay Non so se sia una buona soluzione considerando che ho ottenuto 50 griglie generate dinamicamente, non sono molto interessato all'utilizzo della memoria, quindi non so se è enorme o no. Lo proverò comunque, grazie. – Blowi

+0

Perché potresti aver bisogno di 50 griglie vuote generate dinamicamente? Tuttavia, se si può semplicemente stampare la variabile "s" che è una copia degli appunti, è possibile farsi un'idea se t corrisponde all'output o all'ordine reale dei dati excel – ray

risposta

1

Sostituire

dataGridView.SelectedCells[i].Value = cell;

con

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

+0

Questa è una soluzione molto semplice perché se seleziono in basso a destra in alto a sinistra non funzionerà, comunque l'utente dovrà fare attenzione, grazie :) – Blowi

2
  1. convertire i dati degli Appunti a una matrice a 2 dimensioni. Ricorda la lunghezza di ogni dimensione.
  2. Iterate attraverso le celle selezionate e trovate le celle in alto a sinistra e in basso a destra. Da quello puoi determinare che è della giusta misura.
  3. Utilizzando un doppio ciclo, mappare i dati degli appunti dalla posizione dell'array direttamente alla coordinata della cella (non utilizzando le celle selezionate) utilizzando la coordinata della cella singola come offset.

In alternativa, piuttosto che un array bidimensionale, è possibile creare un elenco di una piccola classe/struttura contenente le proprietà Riga, Col e Valore. Quindi basta scorrere questo piuttosto che il doppio ciclo.

+0

Ci ho pensato e in effetti l'ho provato (ma viceversa, ordinando le celle selezionate in un elenco e ciclicamente), grazie anche a voi :) – Blowi