Concordo con quasi tutto quello che ha detto alex, infatti ho premesso che la risposta era alla carlona.
Per i check, puoi inserirli come campi booleani, quando visualizzi il record avrai la memoria dei flag.
Quando editi vai a visualizzare lo stato del controllo non del record. Puoi togliere il flag, entrare nel campo da modificare, riflaggare il checkbox.
Devi distinguere due momenti:
Il primo è il valore passato al controllo dal database, il secondo è quello che il controllo rilascia al database. Fra questi due momenti puoi cancellare tutti i campi, riscriverli, o lasciarli intatti. Infatti la scrittura dei dati avviene con il post del record. Fino ad allora puoi annullare la modifica o confermarla.
Ciò significa che se il controllo del campo1 valorizzato a 10 puoi modificarlo col valore 5. Anche prima del postrecord puoi prendere il valore del controllo (non del campo in tabella) e leggerlo.
Se lanci un messaggio mentre stai editando, per esempio passando da un controllo all'altro, ti da il valore inserito, non quello che al momento hai nel database. Quindi puoi togliere la spunta, modificare il campo e rimettere la spunta. Al post avrai il nuovo valore del campo e il flag sempre in sola lettura.
Al post devi attribuire al campo il valore visualizzato nel controllo.
Banalmente, per completezza hai un terzo momento, lo capisci scrivendo un valore sul campo e senza uscire dal controllo premere esc. Ti annulla quanto appena digitato.
Il concetto nella scrittura dei dati sul database è analogo, senza post equivale a premere escape.
In ogni caso, io rivedrei la logica che stai applicando, supposto che i dati nessuno se li inventa ma li prende da qualche parte.
A titolo di esempio, se carico l'articolo bagnoschiuma mi accorgo di aver sbagliato se leggo la fattura di carico con dicciaschiuma.
Questo rende i flag solo una perdita di tempo. Poi non so per quale motivo stai usando questa soluzione, magari è necessaria.