Catturare valori riga da un datagrid

lunedì 24 luglio 2006 - 12.31

sasamen Profilo | Newbie

salve,
premetto che sono un javista costretto a lavorare con vb.net, quindi con tutti i limiti che ne derivano.
ho già visto che è possibile estrarre da un datagrid un currentrowindex
quindi, chiamandosi il mio datagrid Emps, per estrarre il valore del campo sID dalla tabella "Dipendenti" nel dataset ds bindato, faccio

ds.Tables("Dipendenti").Rows(Emps.CurrentRowIndex).Item("sID")

fin qui, tutto ok...
ma, se l'utente mi cambia l'ordinamento su colonna?
se, ad esempio, la tabella Dipendenti contiene i campi sID, sNome ed sCognome e l'utente ordina i dati in base a sCcognome, la logica salta.
cosa dovrei fare? disabilitare la possibilità di cambiare l'ordinamento, mi sembra la soluzione più "economica", ma anche la più "sporca".
grazie

Dampyr Profilo | Junior Member

Mi viene in mente solo un'idea, una volta selezionata la riga del datagrid, ti devi ricavare i valori dei campi chiave per quella tabella e poi fare una ricerca all'interno del dataset, per ritrovare la riga selezionata.


... cerca di essere il giocatore di scacchi, non il pezzo sulla scacchiera...

sasamen Profilo | Newbie

innanzitutto... grazie,
dalle mie ricerche risulta che l'oggetto (o "controllo") datagrid sia una delle cose peggio riuscite in casa m$ , a giudicare dalla confusione che regna sovrana in merito all'argomento...
il punto è che la proprietà CurrentRowIndex ritorna un numero sequenziale (base 0) che è in sostanza il numero della riga selezionata, senza nessun legame con l'oggetto Riga, quindi col record contenuto.
la questione è appunto, come giustamente osservi, come fare per ricavare proprio i campi chiave di cui parli?
questa che segue è la parte di codice che definisce il dataset e popola il datagrid:

Dim ds As New DataSet
Dim daMaster As New OleDbDataAdapter("SELECT sID, sNome, sCognome FROM EMPS")
daMaster.Fill(ds, "Dipendenti")
empsGrid.DataSource = ds
empsGrid.DataMember = "Dipendenti"

se adesso voglio il valore del campo sID correntemente selezionato uso

sID = ds.Tables("Dipendenti").Rows(empGrid.CurrentRowIndex).Item("sID")

fin qui, tutto bene, ma se cambio l'ordinamento, il valore di sID non corrisponde + a quanto effettivamente selezionato


>Mi viene in mente solo un'idea, una volta selezionata la riga
>del datagrid, ti devi ricavare i valori dei campi chiave per
>quella tabella e poi fare una ricerca all'interno del dataset,
>per ritrovare la riga selezionata.

sasamen Profilo | Newbie

ok, mi rispondo da solo....
la soluzione -semplice e perversa al tempo stesso- è la seguente:

Dim ds As New DataSet
Dim daMaster As New OleDbDataAdapter("SELECT sID, sNome, sCognome FROM EMPS")
daMaster.Fill(ds, "Dipendenti")
empsGrid.DataSource = ds
empsGrid.DataMember = "Dipendenti"

fatto ciò devo creare una nuova istanza dell'oggetto DataGrid da mettere nell'evento che voglio

Dim dg as DataGrid ' creo un nuovo datagrid
dg = empsGrid ' lo pongo uguale al datagrid corrente (ordinato o meno)
sID = dg(dg.CurrentCell.Rownumber, 1).ToString ' ricavo il valore del campo sID (nella colonna 1)

andreapavia Profilo | Senior Member

Puoi recuperare la riga del datasuorce del tuo datagrid in questo modo

Private Sub TuoDataGrid_MouseUp(ByVal sender As System.Object, ByVal e As
System.Windows.Forms.MouseEventArgs) Handles TuoDataGrid.MouseUp

Dim tastoMouse As String

tastoMouse = e.Button.ToString


Dim pt = New Point(e.X, e.Y)
Dim hit As DataGrid.HitTestInfo = TuoDataGrid.HitTest(pt)

Dim ds As New DataSet
ds = dsDelTuoDatagrid.Clone

***** QUI METTI LA RIGA SELEZIONA IN NUOVO DATASET CHE E' IL CLONE DEL DATASET
***** ASSOCIATO AL TUO DATAGRID: IO USO IL COMANDO TABLE PERCHE' FACCIO RIFERMINTO ***** AL DATAVIEW (se associ il dataset dovrai mettere tables(0))
***** ATTENZIONE A COME SCRIVI table o tables perchè il mio visuol studio qui da lo
***** riempimento automatico del codice

ds.Tables(0).ImportRow(TuoDataGrid.DataSource.table.rows(hit.Row))


***** QUI LO ASSOCI AD UN DATAGRID DI PROVA PER VEDERE SE FUNZIONA
DataGrid1.DataSource = ds.Tables(0)

***** QUI DISTINGUI COSA FARE A SECONDA DEL TASTO DEL MUOSE

If hit.Row > -1 And tastoMouse = "Left" Then

else

end if


ds.dispose

end sub



FUNZIONA SULL'EVENTO MOUSEDOWN E MOUSEUP (non sull'evento click o doppio click)


PS
concordo con te... l'oggetto datagrid è qualcosa di devastante, le cose piu' scontate non le ha....
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-2024
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5