VB Datagridview Tableadapter selezione dati da visualizzare

di il
6 risposte

VB Datagridview Tableadapter selezione dati da visualizzare

Scusate ragazzi,
dopo aver finalmente capito un pochino l' utilizzo dei Datatable e dei Tableadapter mi rimane qualcosa di poco chiaro.
Ho impostato un form nel quale, trascinando una tabella del DB dal riquadro Data Source, ho creato una datagridview e vorrei fare in modo che, in una determinata cella se, nel database è presente un valore specifico (Es. "P"), mi venga visualizzato un altro valore (Es. Pacco). Ovviamente però, se vado a salvare eventuali modifiche, il valore nel database non deve essere modificato. Troppo complicato? Cosa dovrei impostare?

Spero di essermi spiegato senza creare confusione.

Fiducioso vi saluto.

6 Risposte

  • Re: VB Datagridview Tableadapter selezione dati da visualizzare

    Ciao,

    Secondo me:

    1) puoi iterare tutte le righe del DataTable per quella colonna e sostituisci ad es con un Select Case il contenuto sostituendolo con quello di tua scelta.
    
            ' Dato un datatable dt
            For Each riga As DataRow In dt.Rows
                Select Case riga.Item(numColonna)
                    Case "P"
                        riga.Item(numColonna) = "Pacco"
                        ...
                End Select
            Next
    
    2) Quando hai sostituito tutti i valori richiami il metodo AcceptChanges del datatable:
    
             dt.AcceptChanges()
    
    Il metodo serve ad "imbrogliare" il datatable ed indicare che non c'è stata nessuna modifica allo stesso anche se si è in realtà modificato il datatable.

    Dopodichè puoi apportare le modifiche agli altri campi del datatable.

    Ciao.
  • Re: VB Datagridview Tableadapter selezione dati da visualizzare

    Grazie per la risposta Lucius, ma mi sorge un dubbio,
    così facendo, se dovessi poi fare un update del dataset su quel datatable in modo da aggiornare il database, mi porterei dietro la modifica fatta con il select case?
  • Re: VB Datagridview Tableadapter selezione dati da visualizzare

    No se non modifichi altri dati non viene effettuata nessuna modifica al database fisico dopo la chiamata del metodo AcceptChanges.

    Praticamente funziona così:

    1) Gli oggetti DataRow che compongono il DataTable hanno una proprietà DataRowState che permette di capire se la riga stessa è stata cancellata, modificata o aggiunta o unchanged (cioè non ha subito nessuna modifica).
    Quando si riversano le modifiche fatte nel DataTable tutte le righe che hanno il DataRowState diverso da Unchanged vengono processate e riportate sul DataBase fisico in base a quello che si è fatto sulla riga medesima. Pertanto viene aggiunta se ha DataRowState Added, cancellata se è Deleted, etc.

    2) Dopo che si sono riversate le modifiche in automatico viene richiamato il metodo AcceptChanges che riporta la proprietà DataRowState delle righe ad Unchanged.

    Allora:

    1) Tu carichi in memoria il DataTable
    2) Iteri le righe e modifichi i dati che vuoi (es. Pacco al posto della P)
    3) Imposti già che ci sei la proprietà ReadOnly per quella colonna.

    4) a questo punto le righe risultano modificate e richiami il metodo AcceptChanges sul DataTable per riportare la proprietà DataRowState a Unchanged per tutte le righe.
    5) Tutte le righe risultano come non modificate pertanto se riversi le modifiche a questo punto sul database nessuna modifica verrà fatta
    6) A questo punto puoi modificare effettivamente i campi che ti interessano, cancellare e inserire nuove righe
    7) Se riporti le modifiche sul DB fisico verranno inserite le modifiche a partire dal punto 6.

    Verifica così se è corretto quello che ti scrivo.

    1) Carica il datatable
    2) Modifica i campi che ti interessano poi:
    
            ' Posto un DataTable dtProdotti
            For Each righetta As DataRow In dtProdotti.Rows
                MessageBox.Show(righetta.RowState)
            Next
    
            dtProdotti.AcceptChanges()
    
            For Each righetta As DataRow In dtProdotti.Rows
                MessageBox.Show(righetta.RowState)
            Next
    
    Vedrai la differenza tra il prima ed il dopo.
  • Re: VB Datagridview Tableadapter selezione dati da visualizzare

    Scusami per la mia straripante ignoranza, ho provato a fare questo test ma mi sono bloccato praticamente al punto 1, cioè, come faccio a caricare in memoria il datatable?
    Ho provato con:

    dim dtprova as new datatable(dataset.datatable)

    ma ovviamente mi da errore e non mi fa nemmeno utilizzare il datatable direttamente nell' istruzione for each...


    Oltre a questo, ringraziandoti per la perfetta spiegazione perchè sono cose che non conoscevo, ti chiedo un altra cosa:
    Supponiamo che nella mia datagridview ho in una colonna il valore "Pacco" in tutti i record della tabella, a questo punto, se io modificassi qualsiasi altra cella di una riga qualsiasi, e poi riportassi tutto nel database fisico, in quella riga dove ho modificato il valore x, mi porterò dietro anche il valore "Pacco" perchè quella riga non avrà come stato Unchanged, è giusto? Se si, come evito questo problema?

    Grazie ancora.
  • Re: VB Datagridview Tableadapter selezione dati da visualizzare

    Il DataTable lo crei con il metodo Fill dell'oggetto Adapter:

    1) Crei l'oggetto Connection

    2) Crei l'oggetto Command e gli passi la stringa Sql (Select...) e la connection

    3) Crei l'oggetto Adapter (passandogli il Command)

    4) Poi crei il datatable es:
    
        ' Creo l'istanza di un datatable
        Dim dtProdotti As New DataTable("Prodotti")
    
            Try
                ' Apro la connessione
                cnt.Open()
                ' Utilizzo il metodo Fill dell' Adapter
                ' per inserire i dati nel datatable
                adatt.Fill(dtProdotti)
    
                cnt.Close()
            Catch ex As Exception
                MessageBox.Show(ex.Message)
                cnt.Close()
            End Try
    
    Per quanto riguarda l'altro problema hai ragione. Se si modifica la colonna e dopo aver richiamato il metodo AcceptChanges si modifica una cella si scatenerà un'eccezione perchè comunque la cella (quella camuffata) risulta cambiata.

    Io farei così:

    1) Aggiungo il datatable al datagridview

    2) Nascondo la colonna che contiene i dati da camuffare: p... pacco

    3) Aggiungo una colonna al datagridview e con un For Each copio i dati dell'altra colonna in questa passandogli il Select Case.

    4) Questa colonna la metto come ReadOnly

    5) Quando vai a modificare altre celle e vai a salvare le righe modificate nel database fisico non ci sarà nessun problema perchè la colonna reale (quella tirata su in precedenza) non è stata toccata.

    Per aggiungere la colonna:
    
            ' Aggiunge la colonna di nome Copia e Intestazione 
            ' Conf al datagridview dgvProdotti
            dgvProdotti.Columns.Add("COPIA", "CONF")
    
            ' Inserisce la posizione della colonna all'interno del datagridview
            dgvProdotti.Columns("COPIA").DisplayIndex = 1
    
            ' Nasconde la colonna reale recuperata dal database
            dgvProdotti.Columns("CONFEZIONE").Visible = False
    
    Per iterare e copiare il contenuto, cambiandolo al volo:
    
            For Each riga As DataGridViewRow In dgvProdotti.Rows
                Dim tipoConf As String = riga.Cells("CONFEZIONE").Value
    
                Select Case tipoConf
                    Case "P"
                        riga.Cells("CONF").Value = "pacco"
                    Case "S"
                        '....
                End Select
            Next
    
    Modificando le altre celle, verranno correttamente inserite nel database perchè in realtà la colonna originale (confezione) non viene toccata dalle modifiche e la colonna fittizia "CONF" non viene riportata nel database.
  • Re: VB Datagridview Tableadapter selezione dati da visualizzare

    Grazie mille Lucius, dopo varie tribolazioni sono finalmente riuscito a mettere in pratica i tuoi preziosi consigli e devo dire che tutto funziona correttamente.

    Ho ancora un pò di problemi con i metodi dei tableadapter perchè questo meccanismo mi serviva per dividere i record di una tabella in più datagridview e in alcuni casi, se, richiamando il metodo di cui avevo bisogno c'erano errori, il debug non mi generava nessuna eccezione ma semplicemente non eseguiva le istruzioni successive, dove avevo inserito proprio ciò che da te consigliato.
    Adesso ho risolto questi problemi ma mi resta il dubbio sul prechè il debug non mi avvisa se un istruzione che contiene un metodo del tableadapter non viene eseguita.

    Comunque grazie ancora, sei stato gentilissimo!
Devi accedere o registrarti per scrivere nel forum
6 risposte