你说的完全可以做到,我就是这么做的。两种方法:1、这个CHECKBOX用画出来,找2个这样的小图标很简单。在DBGRIDEH的ondrawcolumncell中加入如下代码:procedure TFrmSelect.GridSiteColumnDrawColumnCell( Sender: TObject; const Rect: TRect; DataCol: Integer; Column: TColumnEh; State: TGridDrawState);var OutRect:TRect; CurBitMap:TBitMap;begin inherited; DataM.DBGridEHDrawColumnCell(GridSiteColumn,Rect,GridSiteColumn.Canvas,State); GridSiteColumn.DefaultDrawColumnCell(Rect,DataCol,Column,State); if Column.Index=0 then begin OutRect:=Rect; OutRect.Left:=(Rect.Left+Rect.Right) div 2-8; OutRect.Right:=OutRect.Left+16; OutRect.Top:=OutRect.Top; OutRect.Bottom:=OutRect.Bottom; if SelectedIDStrs.IndexOf(IntToStr(dsSiteColumn.DataSet.FieldByName('ID').AsInteger))<>-1 then //²»ÊÇSITEID CurBitMap:=CheckedBitmap else CurBitMap:=UnCheckedBitmap; GridSiteColumn.Canvas.StretchDraw(OutRect,CurBitMap); end;end;======================用SelectedIDStrs:TStringList来保存已经选取的。接下来就是点击的时候怎么判断问题:在mousemove中加入如下代码:procedure TFrmSelect.GridSiteColumnMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);var T:integer;begin inherited; T:=0;//GridSiteColumn.Columns[0].Width;// if (x>20) and (X<GridSiteColumn.Columns[0].Width+20) and (Y>20) then if (X>T+1) and (X<T+GridSiteColumn.Columns[0].Width) and (Y>20) then GridSiteColumn.Cursor:=MyGetICon('ICONTICK',103) else GridSiteColumn.Cursor:=crDefault;end;这段代码的意思是让鼠标移到这列虚拟CHECKBOX上的时候,变成勾形鼠标。然后就是在mousedown中写如下代码:procedure TFrmSelect.GridSiteColumnMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);begin inherited; if (GridSiteColumn.Cursor=103) and not dsSiteColumn.DataSet.IsEmpty then begin SelectOrDeselectItem(dsSiteColumn.DataSet.FieldByName('ID').AsInteger); GridSiteColumn.Refresh; end;end;这段代码用来处理鼠标点击时,把ID加入SelectedStrs(如果没有),或者从SelectedStrs中删除。2、第二种方法,用ClientDataSet,自定义结构,除了原有字段外,加上一个bit字段,这个字段就是用来选择用的。然后把数据集(如:ADOQUERY)复制到ClientDataSet。接下去应该容易了吧。。。。