Acceptchange su singolo elemento di un datable

di il
21 risposte

21 Risposte - Pagina 2

  • Re: Acceptchange su singolo elemento di un datable

    Allo scopo di non sembrare un vecchio rinc... (vecchio lo sono veramente perchè ho 77 anni e tengo la mente in esercizio con la programmazione) , ho lasciato su WeTransfer una copia del progetto-test su cui stavo lavorando.
    Se vuoi esaminarlo,potrai scaricare da WeTransfer i due files digitando sulla linea di comando del tuo browser il seguente codice :
    https://we.tl/t-QO2cWlo9dm
    Tieni presente che jan.zip (che contiene il file accdb) deve trovarsi su C:\.
    Grazie mille,By65Franco.

  • Re: Acceptchange su singolo elemento di un datable

    28/09/2023 - Jan ha scritto:


    Allo scopo di non sembrare un vecchio rinc... (vecchio lo sono veramente perchè ho 77 anni e tengo la mente in esercizio con la programmazione)

    Prima di tutto tantissimi ma tanti tanti tanti complimenti.

    28/09/2023 - Jan ha scritto:


    Se vuoi esaminarlo

    Volentieri… mo ci provo a scaricarlo ;-)


    EDIT:

    Ok … dopo aver eliminato un po di sicurezze dai file, ci sono , si apre tutto 

    Tieni presente che jan.zip (che contiene il file accdb) deve trovarsi su C:\.

    però il db, come da stringa di connessione deve trovarsi in C:\jan\

    <add name="GestioneLegali.My.MySettings.testCN" connectionString="Provider=Microsoft.ACE.OLEDB.12.0;Data Source=c:\jan\test.accdb"
                providerName="System.Data.OleDb" />

    Domani lo esamino… mo le tardi, alla nostra età bisogna, anche se poco, riposare un po' ;-)

  • Re: Acceptchange su singolo elemento di un datable

    Ciao,

    dunque dunque dunque…. avrei semplificato con meno dichiarazioni e deleghe

    Per esempio:

    DA COSI'
    
        Private Sub DeleteItem_Click(sender As Object, e As EventArgs) Handles DeleteItem.Click
            opt = msg.cancellaRecord
            If opt = DialogResult.Yes Then
                Dim elemento As DataRow = tempDT.Rows(indice)
                'Dim myID As Integer = elemento(0)
                'indice = trovaIndice(myID)
                elemento.Delete()
                indice = cm.Position + 1
                displayRecord()
                displayText(indice)
                ListBox1.Items.Add(elemento("ragsoc1", DataRowVersion.Original) & " - deleted")
            End If
        End Sub
    
    A COSI'
    
        Private Sub DeleteItem_Click(sender As Object, e As EventArgs) Handles DeleteItem.Click
            If msg.cancellaRecord = DialogResult.Yes Then
                ListBox1.Items.Add(tempDT.Rows(dgv.CurrentRow.Index)("ragsoc1", DataRowVersion.Original) & " - deleted")
                indice = dgv.CurrentRow.Index
                tempDT.Rows.RemoveAt(dgv.CurrentRow.Index)
                displayRecord()
                displayText(indice)
            End If
        End Sub
    
    • una cosa che non ho capito e che dovrei approfondire è l'uso della variabile “indice”
    • per esempio in questo caso prenderei l'indice della datagridview dalla riga corrente (dgv.CurrentRow.Index)
      • eseguirei tutte le azioni che riguardano l'uso dell'indice della riga da eliminare prima che venga eliminata dalla datagoridview in quanto generalmente, al momento dell'eliminazione della riga dalla datagridview, la (row Index current), si sposta sulla riga successiva…  pertanto:
        • si aggiunge l'item alla “listbox”
        • si salva per usi futuri nella variabile “indice”
        • infine si elimina la riga corrente dalla datagridviw

    se fai il test con questa piccola variazione al codice vedrai che sull'eliminazione della riga, nella dtagridview non hai più problemi di indice disallineato con il datatable

    Adesso devi solo ricaricare correttamente e nuovamente la datagridview quando esegui il rejectchange
    Non ho di primo acchitto capito perchè non si riflette in automatico sulla datagridview

    Continuo nell'analisi , nel frattempo fai un test sull'indice della riga su eliminazione record


    EDIT:

    Ovviamente se l'uso della variabile “indice” è indispensabile, puoi utilizzarlo anche in questo modo:
    Esempio:

        Private Sub DeleteItem_Click(sender As Object, e As EventArgs) Handles DeleteItem.Click
            If msg.cancellaRecord = DialogResult.Yes Then
                indice = dgv.CurrentRow.Index
                ListBox1.Items.Add(tempDT.Rows(indice)("ragsoc1", DataRowVersion.Original) & " - deleted")
                tempDT.Rows.RemoveAt(indice)
                displayRecord()
                displayText(indice)
            End If
        End Sub
    

    Però sempre mantenendo l'ordine di esecuzione delle righe del codice come detto sopra

  • Re: Acceptchange su singolo elemento di un datable

    29/09/2023 - By65Franco ha scritto:


    tempDT.Rows.RemoveAt(dgv.CurrentRow.Index)

    Remove però è l'equivalente di delete+acceptchange.Il mio dilemma -in fondo- è solo questo: io vorrei riservare l'accept-change (anche per i record cancellati) al termine della sessione di lavoro,perchè  una volta applicato…è definitivo, non ho possibilità di pentimento!

    Applicando remove (o delete+acceptchange), non si presenta alcun problema neanche di sincronizzazione .Prova,infatti a sostituire il codice di delete con questo : 

        Private Sub DeleteItem_Click(sender As Object, e As EventArgs) Handles DeleteItem.Click
            opt = msg.cancellaRecord
            If opt = DialogResult.Yes Then
                Dim elemento As DataRow = tempDT.Rows(indice)
                Dim nominativo As String = elemento(1)
                tempDT.Rows.RemoveAt(indice)
                ListBox1.Items.Add(nominativo & " - deleted")
                displayRecord()
                displayText(indice)
            End If
        End Sub

    29/09/2023 - By65Franco ha scritto:


    però il db, come da stringa di connessione deve trovarsi in C:\jan\

    la stringa di connessione la leggo -come vedi dal codice- dalle proprietà del progetto (My.setting).

    29/09/2023 - By65Franco ha scritto:


    Non ho di primo acchitto capito perchè non si riflette in automatico sulla datagridview

    La disincronizzazione è dovuta alla linea di codice “'indice = cm.Position + 1” ,che sposta in avanti cm.position per non incorrere nell'errore “Impossibile accedere alle informazioni sulla riga eliminata tramite la riga”. Però il rimedio è stato “disastroso”.

    Grazie,By65Franco per le tue gentili parole di conforto.Le ho molto apprezzate.

  • Re: Acceptchange su singolo elemento di un datable

    29/09/2023 - Jan ha scritto:


    La disincronizzazione è dovuta alla linea di codice “'indice = cm.Position + 1” ,che sposta in avanti cm.position per non incorrere nell'errore “Impossibile accedere alle informazioni sulla riga eliminata tramite la riga”. Però il rimedio è stato “disastroso”.

    Perchè tu hai delegato al CurrencyManager come interfaccia tra le classi… secondo me è un po' pesantino ma sicuramente potrebbe andare bene

    Ho una versione di come farei io e di come ti accennavo nei precedenti post… non posso fare le ultime verifiche sull'aggiornamento effettivo verso la tabella del database in quanto dovrei installarmi OLEDB 12.0 …. ma dovrebbe andar bene anche il SAVE definitivo delle modifiche accettate e comunque in sospeso verso la tabella del database.

    ti rimetto in un link il progetto dove sulla tua form in alto a destra trovi il pulsante “Fr65 Version” che apre la form che ho fatto come esempio…magari puoi prendere alcuni spunti come per le textBox della riga attualmente selezionata. 
    Non è rifinito e occorre implementare con controlli e messaggi… serve solo come esempio…

    GestioneAnagraficheFr65.zip

  • Re: Acceptchange su singolo elemento di un datable

    29/09/2023 - By65Franco ha scritto:


    Non è rifinito e occorre implementare con controlli e messaggi… serve solo come esempio…

    By65Franco, pur non conoscendoti, ti considero una persona stimabile. Nessuno si sarebbe preso la briga di tanto.

    Mi piace il tuo modo sintetico di programmare : poche linee di codice per esiti più che soddisfacenti.

    Grazie. Come ti dicevo ieri ,ho modificato il codice : la gestione tramite dataview mi ha eliminato tutti i problemi connessi a delete.

    Gianfranco Napolitano

  • Re: Acceptchange su singolo elemento di un datable

    29/09/2023 - Jan ha scritto:


    By65Franco, pur non conoscendoti, ti considero una persona stimabile. Nessuno si sarebbe preso la briga di tanto.

    Ti ringrazio e contraccambio… 

    Sai, nel mio piccolo se posso essere di aiuto lo faccio molto volentieri e per passione. Il confronto lo ritengo sempre auspicabile e proficuo per imparare qualcosa in più dagli altri.

    Come ti accennavo il Vb è un bel pò che non ci metto le mani e quindi un bel pò di ruggine affiora ;-)

    All'inizio non comprendevo a fondo l'arcano soprattutto perchè abbiamo due approcci diversi per lavorare con le dataGridView… però alla fine in effetti i concetti sono i medesimi. Poi quando ho visto il progetto allora ho capito meglio il problema e ho imparato anche qualcosa in più che normalmente non uso.

    29/09/2023 - Jan ha scritto:


    Mi piace il tuo modo sintetico di programmare : poche linee di codice per esiti più che soddisfacenti.

    In effetti cerco sempre la sintesi, di dichiarare meno variabili possibili, cerco sempre un approccio standard e che sfrutti al massimo le potenzialità che può offrire il linguaggio di programmazione. Insomma… ci provo ;-)

    Nel caso specifico, come ti dicevo, nell'esempio che ho fatto, in pratica cerco di sfruttare al massimo le proprietà delle classi e quindi evito di scrivere a codice come configurare la datagridview, con quale origine dati si deve popolare, quale comportamento deve avere, etc etc…

    Per esempio, ma sicuramente lo saprai già, se fai click destro del mouse all'interno della datagridview e selezioni Modifica Colonne, si hanno a disposizione tutte le proprietà per configurare le varie celle, dall'ampiezza, al font, al formato, etc etc…

    Sempre in progettazione sulla datagridview si imposta il bindingsource e /o altre origini dati, si imposta se deve accettare l'Inset/Update/Delete, etc etc…

    Quindi alla fine preferisco sempre impostare le proprietà in progettazione piuttosto che settarle da codice, mantenendo quest'ultimo snello e di più facile consultazione.

    Un altra cosa molto pratica che uso spessissimo è quella di assegnare alle TextBox l'origine Text per popolarle e come vedi si aggiornano automaticamente  e non si rende necessario scrivere righe di codice… 
    Insomma, cerco di sfruttare quanto più possibile le automazioni accettando di buon grado lo standard che presentano.

    Concludendo sono contento che hai trovato il bandolo della matassa e ti auguro buon proseguimento.

    Ciao
    Franco 

Devi accedere o registrarti per scrivere nel forum
21 risposte