Public oForm oForm = Createobject('comboingrid') oForm.Show Define Class comboingrid As Form Top = 0 Left = 0 Height = 350 Width = 620 DataSession=2 Add Object grdorditems As Grid With ; Height = 300, ; Left = 10, ; Top = 10, ; Width = 600, ; Rowheight = 19,; RecordSource = "orditems", ; Name = "grdOrditems" Procedure Load Use _samples+'Data\orditems' Order Tag order_id Use _samples+'Data\products' In 0 Order Tag product_id Set Relation To product_id Into 'products' In 'orditems' Set Multilocks On CursorSetProp("Buffering",5,'orditems') CursorSetProp("Buffering",5,'products') Endproc Procedure Init With This.grdorditems.Column3 .Bound = .F. .ControlSource = "Products.prod_name" .Width = 170 .AddObject('comboincol','comboincol') .comboincol.Visible = .T. .CurrentControl = 'comboincol' Endwith Endproc Enddefine Define Class comboincol As ComboBox Height = 19 BorderWidth = 0 BoundColumn = 2 BoundTo = .T. ColumnCount = 2 ColumnWidths = "180,0" RowSourceType = 3 RowSource = "select products.prod_name,product_id"+; " from products"+; " into cursor crsProducts"+; " order by 1" SpecialEffect = 1 Style = 2 Procedure Valid Replace product_id With crsProducts.product_id In 'orditems' Endproc Procedure When Select crsProducts Locate For product_id == orditems.product_id This.DisplayValue = crsProducts.prod_name Endproc EnddefinePS: Buffering here in sample is used to keep original data intact.