Newsgroup: it.comp.lang.visual-basic
Titolo: Chiarimenti metodo SORT

?Ciao ragazzi!
Vorrei dei chiarimenti riguardante il metodo sort nella DatagridView di VB 
(utilizzo VB 2008)...
Supponiamo di avere una lista di numeri:
Pippo - 1
Pluto - 2
Paperino - 3
Minni - 4
Topolino - 5
Paperone - 6
...ecc...
Supponiamo ora che io voglia mandare il numero 6 (cio� Paperone) prima del 
numero 1 (cio� prima di Pippo). Tramite codice effettuo lo scambio di numeri 
e quello che gli va dietro fino ad arrivare a:
Pippo - 2
Pluto - 3
Paperino - 4
Minni - 5
Topolino - 6
Paperone - 1
...ecc...
Ora io tramite SORT riordino la lista cos�:
DataGridView1.Sort(DataGridView1.Columns("Ordine"), 
System.ComponentModel.ListSortDirection.Ascending)
Il problema si pone se voglio effettuare un'altra operazione analoga in 
quanto la colonna si trova "in modalit�" SORT e come faccio gli scambi di 
numeri lui mi riordina in modo sbagliato la lista...
Non c'� modo di tornare senza SORT dopo questa riga?:
DataGridView1.Sort() 

 DataGridView1.Sort()
Se � ho capito � una cosa talmente anomala che sarebbe assurdo se fosse
supportato.
Eventualemente aggiungi una colonna nascosta e dagli tu il valore
incrementale che ti serve.
Pippo - 0	2
Pluto - 0	3
Paperino - 0	4
Minni - 0	5
Topolino - 0	6
Paperone - 1	1
Ordini per colonna nascosta e poi per l'altra colonna.

supportato.
Ciao!
Scusa se rispondo ora ma non ero in casa per motivi personali...
Comunque perchè dici che è assurdo? Spiego meglio quello che faccio:
Io ho una lista di clienti con degli ordini quindi spesso allo stesso nome 
sono associati più ordini (esempio con dati inventati):
Ordine - Nome - Articolo (su tre colonne distinte)
01 - Andrea - Televisore
01 - Andrea - Dvd
01 - Andrea - Videoregistratore
02 - Davide - Monitor
02 - Davide - Frigorifero
03 - Luigi - Dvd
04 - Massimo - Televisore
ecc...
Ora, supponiamo che Davide deve essere il primo della lista e quindi:
01 - Davide - Monitor
01 - Davide - Frigorifero
02 - Andrea - Televisore
02 - Andrea - Dvd
02 - Andrea - Videoregistratore
03 - Luigi - Dvd
04 - Massimo - Televisore
ecc...
Per ora il codice è questo (anche se manca un pezzo che implementerò dopo):
If txtOrdine.Text < dgvRiordino.CurrentRow.Cells("Ordine").Value Then 
'Verificare che sia minore mi serve per capire se devo decrementare o 
aumentare i numeri
                Dim NomeCorrente As String = 
dgvRiordino.CurrentRow.Cells("Nome").Value
                Dim index As Short = dgvRiordino.CurrentRow.Index
                Dim NomeProssimo As String = 
dgvRiordino.CurrentRow.Cells("Nome").Value
                'Aggiorno ordine del cliente selezionato, in pratica dal 
primo Davide selezionato fino all'ultimo verrà modificato l'ordine
                While NomeCorrente.Equals(NomeProssimo)
                    dgvRiordino.CurrentRow.Cells("Ordine").Value = 
txtOrdine.Text
                    If index = dgvRiordino.RowCount - 1 Then
                        dgvRiordino.Rows(index).Cells("Ordine").Value = 
txtOrdine.Text
                        Exit While
                        'Esco correttamente dal ciclo in caso fosse 
raggiunto l'ultimo nome della tabella
                    Else
                        NomeProssimo = 
dgvRiordino.Rows(index).Cells("Nome").Value
                        index += 1
                    End If
                End While
                'Aggiorno gli altri clienti
                For i = 0 To dgvRiordino.CurrentRow.Index - 1 'Verifico dal 
primo indice per verificare a quali clienti devo incrementare l'ordine
                    If dgvRiordino.Rows(i).Cells("Ordine").Value >= 
txtOrdine.Text Then
                        dgvRiordino.Rows(i).Cells("Ordine").Value = 
dgvRiordino.Rows(i).Cells("Ordine").Value + 1
                    End If
                Next
End If
Ora dovrei visualizzare la tabella ordinata come indicato prima.
Se però faccio:
dgvRiordino.Sort(dgvNCasse.Columns("Ordine"), 
System.ComponentModel.ListSortDirection.Ascending)
Al prossimo riordino il codice non funziona più correttamente perchè ora 
essendo ordinata la colonna appena si cambia un valore viene subito 
riordinato...
Capito meglio ora quello che vorrei fare io?
Hai qualche suggerimento sul tipo di riordino?


zac
Eh eh eh....manco ci provo ad avventurarmi nei meandri del codice!
Però la colonna che tu chiami "Ordine"....non agganciarla a nulla...e
lavora allora in virtual mode (mezzo bound e mezzo no!)
Perchè abbi pazienza ...sin dal vic-20
01-Andrea-dvd
03-Davide-stereo
sono RECORD...e quindi INSCINDIBILI...ci mancherebbe altro!!!
puoi cambiare facendo una cosa del genere
Riga 1 03-Davide-Stereo
Riga 2 01-Andrea-dvd
oppure
Riga1 01-Andrea-dvd
Riga2 03-Davide-stereo
ad esempio ordinando il primo per ordine decrescente
ed il secondo (tanto per cambiare campo) per Cliente
Tu invece par di capire vorresti cambiare l'id dell'ordine!
Te lo sconsiglio:
pare brutto far arrivare ad Andrea uno stereo se ha ordinato un dvd!!!
Tu ragioni con RECORD non con celle di MATRICI!
è lì la differenza!
Se vuoi ragionare con matrici ...allora puoi mischiare pere e
bulloni...con i record grazie a Dio no!
p.s.
Padrone di svincolare tutto e ragionare con un Array di ordini invece
che con tabelle....ma tutto si ripropone...mai mischiare campi di
records diversi: succede un bel casino!
Vorresti baciare la tua fidanzata e scoprire con la mano che si chiama
Ugo?...lo stesso che pare voglia far tu con questi benedetti records!
eh eh eh!
:)

pare brutto far arrivare ad Andrea uno stereo se ha ordinato un dvd!!!
Cambiando il valore ad entrambi i nomi quello che arriva è sempre lo stesso!
Comunque io ho già un codice funzionante di quello che fa ma è lento perchè 
ogni volta scrivo direttamente nel DataBase, quindi volevo prima lavorare 
nella memoria e poi quando ho finito scrivere nel DataBase i valori 
aggiornati...
Il codice funzionante fa questo: (parte di codice scritto in linguaggio 
formale)
'Aggiorno il nuovo ordine al cliente selezionato
    Apro connessione
    "UPDATE Ordini SET Ordine = @Ordine WHERE Nome = @Nome"
    ("@Ordine", txtOrdine.Text)
    ("@Nome", Replace(dgvRiordino.CurrentRow.Cells("Nome").Value, "'", 
"''"))
    Chiudo connessione
            For i = 0 To dgvRiordino.CurrentRow.Index - 1
                If dgvRiordino.Rows(i).Cells("Ordine").Value >= 
txtOrdine.Text Then
                Apro connessione
                "UPDATE Ordini SET Ordine = @Ordine  WHERE Nome =  @Nome'" & 
Replace(dgvRiordino.Rows(i).Cells("Nome").Value, "'", "''") & "'"
                    ("@Ordine", dgvRiordino.Rows(i).Cells("Ordine").Value + 
1)
                    ("@Nome'", 
Replace(dgvRiordino.Rows(i).Cells("Nome").Value, "'", "''"))
                    Chiudo connessione
                End If
               Next i
Ricarico la tabella
Ovviamente funziona così, perchè agisco direttamente nel DataBase, ma è 
piuttosto macchinoso e non so nemmeno se potrebbe andare bene... 

 Io devo cambiare il valore
...vabbe ...voglio presumere che tu abbia un esigenza particolare!
Perchè altrimenti dimmi perchè compro qualcosa mi dai un codice di
riferimento ordine...e poi lo assegni ad un altro ordine...vabbè
sorvoliamo!
Cmq...
Ordinare non vuol dire RIASSEGNARE!
Quello che vedi non è quello che vuoi fare!
Hai 3 righe
A - 01- PIPPO
B -025 - Pluto
C -035 - Paperino
le riordini in base ad una colonna...ma si trascinano dietro tutte le
colonne del rigo!
Invece tu vuoi spezzare questo vincolo! Non basta riordinare!
in base a cosa vuoi riassegnare l'ordine? e sopratutto DOVE lo
riassegni??? NON nel sort!
Visto che siamo a fare l'analisi per conto tuo una possibile soluzione
Crea una colonna calcolata chiamata ad esempio NUMRIGA
dentro questa colonna NUMERA le righe progressivamente
Prevedi un bottone che MODIFICHI il campo IDordine con quello che c'è
scritto nella cella della colonna NUMRIGA
Scarica la datatable nel database
Adesso lo fà!....quando riordini con il sort e schiacci il tasto
aggiorna...i vecchi IDordine vanno a farsi benedire e sono sostituiti
dal valore di NUMRIGA!
Sarà una fonte di bug incredibili....ma se te la cerchi!
Una cosa un po più logica....ma solo un pochetto!
Prevederebbe di sostituire L'idOrdine di un cliente con un altro:
può succedere se io ditta X rilevo la ditta Y...o compro il suo
ordine!
In quel caso è banale...scambi i due ID...
MA anche qui non con sort! lo fai riassegnando i valori del campo
IDordine...e sopratutto non con tutta una tabella perchè devi sapere
che ordini scambiare
A meno che
non ti costruisca una tua versione personalizzata del SORT che faccia
quello che chiedi...è possibile...con .Net è quasi tutto possibile!
Saluti!
...che fai rinumeri gli ordini per far apparire bianco lo scuro???? eh
eh eh!
Diavolo di un contabile!!!

In quel caso è banale...scambi i due ID...
Esatto, avevo immaginato ad un codice del genere, ma io NON devo scambiare 
di posizione, ma "INSERIRE"
Quello che chiedevo era di operare tramite DataGrid e di vedere a mano a 
mano la tabella riordinata (e quando ho finito salvare il tutto) proprio 
come accade adesso; solo che adesso funziona perchè l'ORDINE (del cliente 
selezionato e di quelli spostati) lo "salvo" nel DataBase ogni volta che c'è 
un riordino da fare!
Se ancora non è chiaro...va beh...continuo ad utilizzare il mio metodo che 
funziona, fa quello che chiedo, lento (solo nei casi estremi) ma funzionante 
;-) 

 alcuni clienti e poi altri.
Guarda questo thread, c'e' l'esempio di come spostare righe in una 
datagrid, forse fa al caso tuo.
In particolare guarda il codice postato nell'intervento lun 13 ott 2008 
- 00.05
http://www.dotnethell.it/forum/messages.aspx?ThreadID=25678
Un altro metodo molto + semplice (secondo me) per risolvere il tuo 
problema è il seguente:
Aggiungi nella datagrid una colonna che si chiama "ordine di consegna" e 
che inizialmene è zero per tutti e li dentro quando riordini le righe ci 
scrivi i numeri da 1 a N indicando in che ordine consegnare i prodotti.
Rileggi la datagrid ordinandola per quel campo e sei a posto.
ciao
Mauro