One solution is using two controls in each column, one readonly, one not readonly and select them via DynamicCurrentControl. You also might try setting readonly in AfterRowColchange, which could be less work, but Dynamic properties are sure to work automatically in any way of row changes, also from outside via GOTO, SIP, LOCATE or SEEK, which all don't cause the grid event. Don't forget to set the columns sparse to .F. to let each row show it's differing control, even if it just differs in the readonly.
Bye, Olaf.