The following example uses the getColumnOrder( ) method with a form's onOpen and onClose event handlers to store, and subsequently recall, a Grid's column order.

parameter bModal 

local f 

f = new testGridForm() 

if (bModal) 

f.mdi = false // ensure not MDI 

f.readModal() 

else 

f.open() 

endif 

class testGridForm of FORM 

with (this) 

onOpen = class::FORM_ONOPEN 

onClose = class::FORM_ONCLOSE 

height = 16 

left = 29.4286 

top = 3.6818 

width = 78.4286 

text = "" 

endwith 

this.PLUSSAMPLE1 = new DATABASE() 

this.PLUSSAMPLE1.parent = this 

with (this.PLUSSAMPLE1) 

left = -1.1429 

top = 0.5 

databaseName = "PLUSSAMPLE" 

active = true 

endwith 

this.FISH1 = new QUERY() 

this.FISH1.parent = this 

with (this.FISH1) 

left = -1.1429 

top = 0.5 

database = form.plussample1 

sql = "select * from fish.dbf" 

active = true 

endwith 

this.GRID1 = new GRID(this) 

with (this.GRID1) 

dataLink = form.fish1.rowset 

columns["COLUMN1"] = new GRIDCOLUMN(form.GRID1) 

columns["COLUMN1"].dataLink = form.fish1.rowset.fields["id"] 

columns["COLUMN1"].editorType = 1 // EntryField 

columns["COLUMN1"].width = 10.7143 

columns["COLUMN2"] = new GRIDCOLUMN(form.GRID1) 

columns["COLUMN2"].dataLink = form.fish1.rowset.fields["name"] 

columns["COLUMN2"].editorType = 1 // EntryField 

columns["COLUMN2"].width = 17.8571 

columns["COLUMN3"] = new GRIDCOLUMN(form.GRID1) 

columns["COLUMN3"].dataLink = form.fish1.rowset.fields["species"] 

columns["COLUMN3"].editorType = 1 // EntryField 

columns["COLUMN3"].width = 19.1429 

columns["COLUMN4"] = new GRIDCOLUMN(form.GRID1) 

columns["COLUMN4"].dataLink = form.fish1.rowset.fields["length cm"] 

columns["COLUMN4"].editorType = 3 // SpinBox 

columns["COLUMN4"].width = 10.2857 

columns["COLUMN5"] = new GRIDCOLUMN(form.GRID1) 

columns["COLUMN5"].dataLink = form.fish1.rowset.fields["description"] 

columns["COLUMN5"].editorType = 1 // EntryField 

columns["COLUMN5"].width = 11.7143 

with (columns["COLUMN1"].headingControl) 

value = "ID" 

endwith 

with (columns["COLUMN2"].headingControl) 

value = "Name" 

endwith 

with (columns["COLUMN3"].headingControl) 

value = "Species" 

endwith 

with (columns["COLUMN4"].headingControl) 

value = "Length CM" 

endwith 

with (columns["COLUMN5"].headingControl) 

value = "Description" 

endwith 

bgColor = "white" 

rowSelect = true 

hScrollBar = 1 // On 

vScrollBar = 1 // On 

height = 11.5 

left = 1.2857 

top = 2.7727 

width = 76.2857 

endwith 

this.TEXTLABEL1 = new TEXTLABEL(this) 

with (this.TEXTLABEL1) 

height = 1 

left = 22.2857 

top = 0.3182 

width = 41 

transparent = true 

text = "Grid.getColumnRows() example" 

colorNormal = "Blue" 

fontSize = 14 

endwith 

this.TEXTLABEL2 = new TEXTLABEL(this) 

with (this.TEXTLABEL2) 

height = 1 

left = 22 

top = 1.5909 

width = 40.5714 

text = "Move columns around, close form, re-run it ..." 

endwith 

this.rowset = this.fish1.rowset 

function form_onClose 

// Store column order to an array: 

aGridOrder = form.grid1.getColumnOrder() 

// save to a table 

if not file( "SaveGrid.dbf" ) 

// it doesn't exist -- save it 

create table SaveGrid ; 

( QueryName char( 20 ),; 

FieldName char( 20 ) ) 

else 

// it does exist, empty it! 

_app.databases[1].emptyTable( "SaveGrid" ) 

endif 

// create query: 

qSaveGrid = new query() 

qSaveGrid.sql = "select * from SaveGrid" 

qSaveGrid.active := true 

// loop through the grid's order and save it 

for i = 1 to aGridOrder.size/2 // two columns 

// column one is query name 

// column two is field name 

? aGridOrder[i,1], aGridOrder[i,2] 

qSaveGrid.rowset.beginAppend() 

qSaveGrid.rowset.fields["QueryName"].value := aGridOrder[i,1] 

qSaveGrid.rowset.fields["FieldName"].value := aGridOrder[i,2] 

next 

// cleanup 

qSaveGrid.active := false 

release object qSaveGrid 

return 

function form_onOpen 

// get information for grid: 

if file( "SaveGrid.dbf" ) 

// create query: 

qSaveGrid = new query() 

qSaveGrid.sql = "select * from SaveGrid" 

qSaveGrid.active := true 

// loop through the table and set grid's Columns: 

i=0 

do while not qSaveGrid.rowset.endOfSet 

i++ 

// set the datalink: 

cCommand = 'form.grid1.columns['+i+'].dataLink = form.'+; 

qSaveGrid.rowset.fields["QueryName"].value.rightTrim()+'.rowset.fields["'+; 

qSaveGrid.rowset.fields["FieldName"].value.rightTrim()+'"]' 

&cCommand. 

// Column header: 

form.grid1.columns[i].headingControl.value := ; 

qSaveGrid.rowset.fields["FieldName"].value.rightTrim() 

// next row 

qSaveGrid.rowset.next() 

enddo 

// cleanup 

qSaveGrid.active := false 

release object qSaveGrid 

endif 

return 

endclass