DEFINE class MyGrid as grid DeleteMark = .F. Height = 300 Left = 28 RecordMark = .F. Top = 0 Width = 600 Editmode=.T. SplitBar=.F. Name = "grdCustom" PROCEDURE addcolumn LPARAMETERS nIndex, cAlias, cField, tnWidth NODEFAULT this.addobject("clm"+cField,"MyColumn", nIndex, cAlias+"."+cField, tnWidth) ENDPROC PROCEDURE init LPARAMETERS tcRecordsource WITH this .Columncount = -1 .recordsource = tcRecordsource nOldColCount = .columncount FOR ix = 1 to fcount(tcRecordsource) .AddColumn(ix, tcRecordsource,field(ix,tcRecordsource),.Columns(ix).Width) ENDFOR FOR ix = nOldColCount to 1 step -1 .RemoveObject(.Columns(ix).name) ENDFOR ENDWITH ENDPROC ENDDEFINE DEFINE class MyColumn as column Resizable = .F. Movable = .F. PROCEDURE init LPARAMETERS nIndex, cControlSource, tnWidth WITH this .Width = tnWidth .controlsource = cControlSource .ColumnOrder = nIndex .AddObject("MyText","MyGridTxtBox") .removeobject("Header1") .Addobject("Header1","MyHeader",.ControlSource) .CurrentControl = "MyText" .Sparse = .F. .DynamicBackColor = ; "iif(type('"+.ControlSource+"')='D', rgb(192,192,192),"+; "iif(type('"+.ControlSource+"')='T', rgb(0,255,0),"+; "iif(type('"+.ControlSource+"')='N', rgb(0,128,0),rgb(255,255,255) )))" ENDWITH ENDPROC PROCEDURE click WAIT window nowait 'This is column click' ENDPROC ENDDEFINE DEFINE class MyGridTxtBox as TextBox Name = "Text1" SelectOnEntry = .T. BorderStyle = 0 PROCEDURE when RETURN ( this.parent.parent.Editmode ) ENDPROC PROCEDURE click WITH this .Selstart =0 .Sellength = 9999 ENDWITH ENDPROC ENDDEFINE DEFINE class MyHeader as Header Name = "Header1" PROCEDURE init LPARAMETERS tcSource Activate screen tcCaption = dbgetprop(tcSource, 'Field','Caption') tcCaption = iif(empty(tcCaption),substr(tcSource,at('.',tcSource)+1),tcCaption) WITH this .Alignment = 2 .Backcolor = rgb(255,255,0) .Forecolor = rgb(0,0,255) .Caption = tcCaption ENDWITH ENDPROC PROCEDURE click this.caption = iif(isupper(this.caption),lower(this.caption),upper(this.caption)) ENDPROC ENDDEFINECetin