Newsgroup: it.comp.lang.visual-basic
Titolo: come funziona il controllo datagrid???

...come da oggetto, qualcuno può postarmi un codice di esempio che mi popoli
un datagrid da un recordset??? grazie!!!
--
~~ A L B A D U R ~~
noi simme cori aridi,
nimici de la pace
quanno due cori s'ammano
noi tutti ci dispiace
http://web.tiscali.it/smisuratapreghiera/

 un datagrid da un recordset??? grazie!!!
Cos'è.........pigrizia?!
Metti un controllo DataGrid in una form, selezionalo facendoci click sopra e
poi........... premi F1.

 ha scritto nel messaggio
news:6RER9.55975$Q%4.18...@news1.tin.it...
Proprietą DataSource
trovi esempi...e quant'altro semplicemente schacciando f1 e cercando
datagrid!!!!

 popoli un datagrid da un recordset??? grazie!!!
Set DataGrid1.RecordSource = rs
Andrea

...non č assolutamente pigrizia, il fatto č che ho provato e non funziona:
io ho fatto:
Set datagrid.DataSource =  result 'sarebbe il recordset
elenco.Refresh
ma quando mando in esecuzione il progetto non mi funziona, il datagrid non
si popola!
nel mio caso specifico il recordset č formato da 4 0 5 campi in quanto la
query che ho fatto comprende tutti i campi del db "select  * ecc ecc"
io vorrei che nel datagrid vengano mostrati solo due campi da me definiti,
ma purtroppo non mi č chiara la dinamica di funzionamento del controllo!!!!
grazie!


Se tu potessi postare sufficiente codice in modo da poter fare una
simulazione, ti aiuterei molto volentieri.

detto fatto:
innanzitutto ho posizionato un datagrid sulla form, ci sono 2 colonne,
ho cliccato col destro sul controllo e nella finestra delle propietà ho dato
alla prima colonna il label "codice" e alla seconda colonna "descrizione",
nell'evento load della form ho inserito questo codice:
sql = "select * from miatabella"
Set result = recset(sql)
'la funzione recset prende in input la stringa con l'istruzione sql
'e restituisce in output il recordset utilizzando adodb
Set datagrid.DataSource = result
datagrid.Refresh
closedb
'con closedb chiudo la connessione al db
questo è tutto il codice che ho scritto finora, quando mando in esecuzione
non mi viene generato nessun errore ma semplicemente il datagrid non si
popola
io vorrei che perlomeno venisse popolato dai campi codice e descrizione
presenti appunto nella mia tabella......bo!
grazie dell'aiuto!



Da quello che so il datagrid non funziona con recordset disconessi; quindi
fino a quando il datagrid è attivo devi tenere aperta la connessione.
Per il resto se hai aperto la connessione lato client, se la tabella ha una
chiave primaria definita, non dovresti avere altri problemi.

bo, ho provato a commentare la sub di chiusura ma il risultato è lo
stesso....


 ha scritto nel messaggio
news:eAFR9.56159$Q%4.18...@news1.tin.it...


 'con closedb chiudo la connessione al db
Perchè chiudi la connessione? Togli la riga.

 datagrid.Refresh
Fai un po' di debug e controlla se resul contiene record. ad esempio:
print result.recordcount

quello che segue è il codice relativo alla funzione che mi restituisce il
recordset, magari può servire!
Function recset(sql As String) As ADODB.Recordset
nomedb = App.Path & "\mdb\miodb.mdb"
strcn = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & nomedb & ";Persist
Security Info=False"
Set cn = New ADODB.Connection
Set rs = New ADODB.Recordset
cn.Open strcn
rs.Open sql, cn, 3, 3
Set recset = rs
End Function


il recordset contiene ben quattro record, quelli che del resto ho inserito
nella mia tabella....da che può dipendere?


Dove vengono dichiarati cn e rs?
prova ad inserire queste righe nel form load del tuo datagrid e poi incolla
successivamente in questo modo:
Dim cn as new adodb.connection
Dim rs as new adodb.recordset
Sub Form_Load(....)
    nomedb = App.Path & "\mdb\miodb.mdb"
    strcn = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & nomedb &
";Persist
    Security Info=False"
    cn.Open strcn
    rs.Open sql, cn, 3, 3
    Set datagrid.DataSource = rs
end sub
Sub Form_Unload(...)
    rs.close
    cn.close
    rs = nothing
   cn = nothing
end sub

dunque, ho seguito il tuo consiglio e quado mando in esecuzione mi da
quest'errore:
necessario oggetto
sulla riga
   cn.Open strcn
in risposta alla tua domanda ho da dirti che in origine io avevo dicchiarato
connection e recordset nel modulo.


 ha scritto nel messaggio
news:IXFR9.56279$Q%4.18...@news1.tin.it...


si, ho fatto esattamente come mi hai scritto!


 End Function
In Function recset metti la riga che segue:
    cn.CursorLocation = adUseClient
ovviamente _prima_ di aprire la connessione.
Il codice comunque non è pulito. Io ti consiglio, in primis, di mettere in
testa a tutto un bel OPTION EXPLICIT e di modifcare poi ilcodice di
conseguenza.
Ti allego un mio esempio:
Option Explicit
Function recset(ByVal sql As String, ByVal nomedb As String) As
ADODB.Recordset
    Dim cn As ADODB.Connection
    Dim rs As ADODB.Recordset
    Dim strcn As String
    Set cn = New ADODB.Connection
    Set rs = New ADODB.Recordset
    cn.CursorLocation = adUseClient
    nomedb = "C:\Programmi\Microsoft Visual Studio\VB98\BIBLIO.MDB"
    strcn = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & nomedb &
";Persist Security Info=False"
    cn.Open strcn
    rs.Open sql, cn
    Set recset = rs
End Function
Private Sub Form_Load()
    Dim sql As String
    Dim rs As ADODB.Recordset
    Dim nomedb As String
    Set rs = New ADODB.Recordset
    sql = "SELECT * FROM TITLES"
    nomedb = "C:\Programmi\Microsoft Visual Studio\VB98\BIBLIO.MDB"
    Set rs = recset(sql, nomedb)
    Set DataGrid.DataSource = rs
    DataGrid.Refresh
End Sub

     nomedb = "C:\Programmi\Microsoft Visual Studio\VB98\BIBLIO.MDB"
[CUT]
Ovviamente quest'ultima riga _non_ ci vuole. Scusa.

Ultima considerazione prima della cena.
1) La riga DataGrid.Refresh non è necessaria;
2) Devi anche accedere alle proprietà della DataGrid e, nel folder
Colonneassegnare l'esatto DataField, oppure (e sarebbe meglio) fallo a
runtime.

un passo in avanti l'abbiamo fatto....grazie al codice che mi hai mandato
ora quando mando in esecuzione l'applicazione il datagrid mi mostra 4 righe
che corrispondono al numero esatto di record contenuti nel recordset,
naturalmente perň il controllo č rimasto vuoto non so perchč......manca poco
per svelare l'arcano!!!


 per svelare l'arcano!!!
Io sono sicuro che non hai assegnato i nomi esatti ai DataField delle
colonne del DataGrid. Hai controllato? Diversamente, non rimane che postarmi
il progetto VBP. Se vuoi ti mando la mia mail.

grazie...con questo tuo ultimo aiuto sono riuscito a risolvere il
problema....grazie davvero!
vorrei chiederti altre due cose:
è possibile che il datagrid non sia ridimensionabile per l'utente finale?
e soprattutto che sia "di sola lettura" nel senso che l'utente può solo
selezionare il record relativo ma non modificarlo???
grazie dell'aiuto!!


 selezionare il record relativo ma non modificarlo???
Sono possibili entrambe le cose.
Se guardi fra le proprietà del DataGrid (click destro del controllo e poi
scegli proprietà) puoi regolare  il funzionamento globale e delle singole
colonne del controllo, vedi ad esempio AllowUpdate nel folder Generale,
Locked e AllowSizing nel folder Layout.
Io pero' ti consiglio di darti una bella lettura all'help in linea cosi' da
farti una idea complessiva sul funzionamento di questo controllo.