Spostare le righe di una DataGrid

venerdì 03 ottobre 2008 - 12.18

RekLats Profilo | Newbie

ciao a tutti...

ho una datagrid alla quale inserisco "manualmente" le righe.... Poi però avrei bisogno di poterle spostare in alto o in basso (di una posizione alla volta).
Cioé, dopo avere selezionato una riga, tramite il click su un button apposito (rigaSù e rigaGiù, ad esempio) dovrei poter shiftare di una posizione in alto o in basso la singola riga.
Come si può realizzare questo shift?

Grazie

secks Profilo | Senior Member

La datagrid è alimentata da una DataTable?
Sono pochi i record?

Se è così aggiungi un campo univoco con il numero della riga progressivo nella DataTable.
Imposti l'ordinamento della datagrid sul suddetto campo.
Al click sul pulsante della riga cambi il numero della riga spostando il numero di quella su qui sei posizionato su quella precedente e viceversa..

Se ti piace l'idea e non sono stato chiaro fammi sapere che provo a spiegarmi meglio.

Ciao.
Paolo.

RekLats Profilo | Newbie

La datagrid è alimentata una riga alla volta. Gli elementi di ogni riga vengono immessi dall'utente su apposite textbox.
Credo di aver capito il concetto del numero progressivo... ma a questo punto non saprei come "impostare l'ordinamento" su tale numero, come tu hai detto...

Ah e un'altra cosa... all'inizio la datagrid, prima di inserire la prima riga, compare con una riga vuota dove nella cella più a sinistra c'è un asterisco... Come si fa a visualizzare la DG senza questa riga vuota? Spero sia possibile con un comando da codice...

Grazie mille per l'aiuto!

secks Profilo | Senior Member

Io di solito alimento la DataGrid con una DataTable

Dim t As DataTable = New DataTable(TABFILCONV)
Dim c As DataColumn

c = New DataColumn
c.DataType = System.Type.GetType("System.String")
c.ColumnName = "Conta"
c.Caption = "Contatore"
c.MaxLength = 3
c.ReadOnly = False
t.Columns.Add(c)

c = New DataColumn
c.DataType = System.Type.GetType("System.String")
c.ColumnName = "Campo2"
c.Caption = "Pluto"
c.MaxLength = 50
c.ReadOnly = False
t.Columns.Add(c)

t.DefaultView.AllowNew = False 'non visualizza riga vuota

DataGrid1.DataSource = t

In questo modo torniamo al mio esempio.
Non so' che utilizzo fai poi della DataGrid, cmq poi i dati inseriti li puoi estrarre sempre in DataTable

Dim t as datatable = ctype( datagrid1.datasource, Datatable )

Ciao.
Paolo.

RekLats Profilo | Newbie

Grazie Paolo, sei stato gentilissimo!

La datagrid potrebbe contenere anche migliaia di righe... per cui non so se mi conviene tenere in memoria tutta questa informazione in una DataTable. In realtà mi è stato sconsigliato per non dire evitato di tenere tutto in memoria.
Il recupero dell'informazione di interesse può essere fatto mediante il parsing di una cella della riga selezionata all'interno della DG: ossia l'utente scorre la DG, trova la riga di suo interesse, la seleziona e preme un pulsante che attiva il parse di una cella di quella riga, recuperando l'informazione.
A questo punto il problema (per me!) è quello di accedere una cella della riga selezionata (credo che essa si evidenzi pure in blu) tramite una qualche proprietà... Come posso fare?

Ciao e grazie ancora.

P.S. Il linguaggio che utilizzo è il C#, se vuoi darmi anche del codice, altrimenti anche una semplice "drittina" andrebbe bene...

Lanello Profilo | Senior Member

Ciao, scusate l'intromissione...

>La datagrid è alimentata una riga alla volta. Gli elementi di
>ogni riga vengono immessi dall'utente su apposite textbox.
>Credo di aver capito il concetto del numero progressivo... ma
>a questo punto non saprei come "impostare l'ordinamento" su tale
>numero, come tu hai detto...

per spostare la riga puoi usare i metodi di insert e di delete delle righe, tu dici che popoli la griglia senza usare il dataset (nel modo che anche secondo me è il migliore), quando vuoi spostare una riga, puoi creare un'oggetto datagridrow e copiarci dentro il contenuto della riga selezionata, la riga interessata poi la cancelli con un bel "delete" e ne rifai l'insert (non l'add che accoda in fondo) che ti chiede come parametro l'id della riga SOTTO alla quale vuoi inserire quella che gli passi. ed il gioco è fatto.

>Ah e un'altra cosa... all'inizio la datagrid, prima di inserire
>la prima riga, compare con una riga vuota dove nella cella più
>a sinistra c'è un asterisco... Come si fa a visualizzare la DG
>senza questa riga vuota? Spero sia possibile con un comando da
>codice...

l'asterisco è dovuto alla possiblità che nel designer puoi impostare facendo clic con il destro sulla griglia di permettere o no all'utente di modificare i dati mentre li visualizza (e se non usi il dataset e non vuoi impazzire te lo consiglio caldamente) mentre la colonna grigia la puoi spengere mettendo a false la proprietà del datagridview
rowheadervisible

spero di avervi aiutato un po ;)

----------------------------------------------------------------------
http://www.flashinlabs.biz o .com o .net o .it fate voi :P

secks Profilo | Senior Member


>A questo punto il problema (per me!) è quello di accedere una
>cella della riga selezionata (credo che essa si evidenzi pure
>in blu) tramite una qualche proprietà... Come posso fare?

Se clicchi sulla cella c'è la possibilità di intercettare il RowIndex della cella:

string pippo = DataGridView1.Columns[e.RowIndex].Cells["NomeCampo"].Value

dovrebbe darti il contenuto della cella.

Più di tanto non so aiutarti in quanto anch'io mi sono avvicinato da poco a C# e DataGridView (usandola principalmente associata ai dati)

Ciao.
Paolo.

RekLats Profilo | Newbie

Vi ringrazio per i preziosi suggerimenti che mi state fornendo.... sto imparando sempre di più giorno per giorno anche grazie a voi!
Ok per l'accesso agli elementi delle righe della DG....

Ora, per spostare le righe sù e giù all'interno della datagrid, io l'ho pensata così:
- ricordo che ho due pulsanti: buttonRowUp e buttonRowDown. Agli eventi click associati a questi bottoni io, selezionata una riga nella DG, posso spostare tale riga di una posizione in alto o in basso.
- nel metodo chiamato dall'evento RowHeaderMouseClick memorizzo in una variabile temporanea (private?) il numero di riga (e.RowIndex?);
- se non ho capito male l'header di riga è quella casella grigia tutta a sinistra che ti consente di selezionare la riga, la quale si colora poi di blu; quindi credo che impostando a false la visibilità dell'header di riga non è possibile selezionare ed evidenziare l'intera riga;
- poi raccolgo l'evento click di uno dei pulsanti buttonRowUp o buttonRowDown e all'interno del suo metodo riprendo la variabile che memorizza il numero della riga selezionata precedentemente; ora posso gestire lo scambio di righe avendo a disposizione l'index della riga selezionata, nella maniera che mi è stata suggerita in uno dei commenti precedenti (rimuovendo e reinserendo la riga).

Correggetemi se ho scritto qualche errore/inesattezza, oppure se avete un metodo migliore per lo spostamento/scambio delle righe in DG è ben accetto.

Grazie ancora per la disponibilità...
Simone

alexmed Profilo | Guru

Ciao
il fatto che tu inserisca "manualmente" le righe mi ha fatto venire in mente una possibile soluzione

Questa soluzione prevede che tu aggiunga una colonna nel quale vai ad inserire un contatore.

Prima di aggiungere una riga vado a leggere il valore del contatore dell'ultima riga inserita
se non vi sono righe il contatore sarà zero

Aggiungo una riga (contatore + 1) = 1
Aggiungo una riga (contatore + 1) = 2
Aggiungo una riga (contatore + 1) = 3

Ammettiamo di voler spostare la riga al contatore (3) in sù:
Al posto di "spostare" le righe inverto i valori dei contatori quindi la riga con contatore (2) assumerà il valore (3) e viceversa
A questo punto mi basterà ordinare la colonna contatore.

è solo un'idea, ma dovrebbe funzionare.
Per evitare problemi dovresti fare in modo che se selezioni la prima il tasto spostaSu e se selezioni l'ultima il tasto spostaGiù vengano disabilitati.

Ciao



Lanello Profilo | Senior Member


>Ok per l'accesso agli elementi delle righe della DG....



>Ora, per spostare le righe sù e giù all'interno della datagrid,
>io l'ho pensata così:

io farei cos' che è MOOOOOLTO più semplice...

nell'evento up o down ovviamente stando attenti a quando si è all'inizio o alla fine della tabella come ti hanno detto nel post precedente

Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra

visto che prima di postare qualsiasi pezzo di codice l'ho voluto provare, eccoti una piccola app FUNZIONANTE! con tutte le routines, basta che crei una form, ci metti un datagridview e due button e la vedrai funzionare.



se ti è utile accetta la risposta plz
----------------------------------------------------------------------
http://www.flashinlabs.biz o .com o .net o .it fate voi :P

alexmed Profilo | Guru

Ciao lanello
C'è solo un problema. Se ti muovi con le frecce l'indice della riga selezionata non cambia.

Lanello Profilo | Senior Member



ma basta intercettare l'evento keypress

ragazzi me lo dite ve lo faccio io il software a sto punto

skerzo dai

evento keyup (al rilascio del tasto almeno se un utente tiene premuto un tasto per spostarsi di 1000 righe funge lo stesso ) basta catturare l'e.rowindex come per l'evento click
----------------------------------------------------------------------
http://www.flashinlabs.biz o .com o .net o .it fate voi :P

RekLats Profilo | Newbie

grazie per il frammentone di codice, funziona anche senza refresh della DataGrid (forse in C# lo fa in automatico).

Non mi è stato posto (da chi mi commissiona il lavoro) il problema di spostare le righe con le frecce direzionali, avendo a disposizione i button Up e Down. Credo almeno che si riferisca a quello la cattura dell'evento KeyPress, no? Comunque potrà sempre tornarmi utile...!
Grazie a tutti

simone

alexmed Profilo | Guru

Ciao
Mi riferisco al fatto che se clikki con il mouse sulla riga da spostare tutto fila liscio, ma se una volta fatto click su una riga l'utente si sposta all'interno della DGV con le fracce (o con i tasti PagUP e PagDown) non aggiorni il riferimento della riga da spostare ed è per questo che lanello ha suggerito di implementare il codice con
>ma basta intercettare l'evento keypress

Ciao
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2025
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5