y = ThisForm.lst_theList.listCount z = 0 && Number of elements we init ln_topid = ThisForm.lst_theList.topitemid ln_itemid = ThisForm.lst_theList.Listitemid * initArray and selArray are custom form properties. * initArray has the same number of rows as the list (setup in Form.init), and all elems are .F. * This inits selArray DIMENSION ThisForm.selArray[ALEN(ThisForm.initArray,1)] ACOPY(ThisForm.initArray,ThisForm.selArray) * grab the id's of the selected items FOR x = 1 TO y IF ThisForm.lst_theList.SelectedID[x] z = z + 1 ThisForm.selArray[z] = x ENDIF ENDFOR * clip length of array DIMENSION ThisForm.selArray[z] **** Do what you want to do here: **** SELECT delme SCAN * Nothing just testing ENDSCAN * restore item id here ThisForm.lst_theList.Listitemid = ln_itemid * Restore Selected items only FOR x = 1 TO ALEN(ThisForm.selArray,1) ThisForm.lst_theList.selected[ThisForm.selArray[x]] = .T. ENDFOR * set top id ThisForm.lst_theList.topitemid = ln_topidBy saving and restoring only those that are selected, you significantly cut back on the overhead. I tried this in a list box with 250 items, and it seemed to work, there was a slight flash, but your lock form idea may prevent that.