DEFINE CLASS ColHeader as Header MClicked = .F. && in process of a click? IndOrder = '' && tag name of index for column PROCEDURE MouseDown LPARAMETERS nButton, nShift, nXCoord, nYCoord IF !EMPTY(This.IndOrder) && ignore empty tags IF nButton = 1 && left button This.MClicked = .T. && now in process of a 'click'. ENDIF Endif ENDPROC PROCEDURE MouseUp LPARAMETERS nButton, nShift, nXCoord, nYCoord LOCAL lnRecNo ThisForm.LockScreen = .T. IF !EMPTY(This.IndOrder) * do nothing if right button, if mouseup on some other column, or if column being moved IF nButton = 1 AND This.MClicked AND This.Parent.ColumnOrder = This.Parent.PrevOrder IF ThisForm.AllowHeaderClick && form says ok to click header lnRecNo = RECNO() && save record * if this index already set, reverse order IF ORDER() = UPPER(This.IndOrder) IF DESCENDING() SET ORDER to TAG (This.IndOrder) ASCENDING ELSE SET ORDER to TAG (This.IndOrder) DESCENDING ENDIF ELSE && otherwise, use ascending SET ORDER to tag (This.IndOrder) ASCENDING ENDIF This.Parent.Parent.Refresh() && grid refresh GOTO lnRecNo && get back to where we were ENDIF ENDIF ENDIF ** reset all columns' Mclicked to .F. IF nButton = 1 FOR lnCount = 1 TO This.Parent.Parent.ColumnCount lcHeader = 'This.Parent.Parent.Columns[' + ; ALLTRIM(STR(lnCount)) + '].ColHeader1.MClicked = .F.' &lcHeader ENDFOR Endif * set column prevorder This.Parent.PrevOrder = This.Parent.ColumnOrder ThisForm.LockScreen = .F. ENDPROC ENDDEFINE>The downloaded example is a complex class created to do this work with a ton of functions that check for mouse movement, double-clicking and so forth. I was looking for a much simpler answer, I guess... Maybe the anser isn't simple!