DBGridEh如何设置CheckBox?(200)

  • 主题发起人 主题发起人 胡鸣
  • 开始时间 开始时间

胡鸣

Unregistered / Unconfirmed
GUEST, unregistred user!
在DBGridEh中,我想在第一列中显示CheckBox,利用它一次选择几行进行删除,但数据表中没有bit字段,又不想为此在数据表中增加一个字段,如何添加一临时字段来实现上述功能?
 
用mulselected怎么知道哪些行已被选中?
 
option设置为mulselected.dbgrideh1.SelectedRows.Count; 选中的记录数记录滚动到选中的某行记录上:dbgrideh1.datasource.dataset.GotoBookmark( Pointer(dbgrideh1.SelectedRows.Items[选中的第几条记录]));
 
dbgrideh1.SelectedRows.Count; 选中的记录数记录滚动到选中的某行记录上:dbgrideh1.datasource.dataset.GotoBookmark( Pointer(dbgrideh1.SelectedRows.Items[选中的第几条记录]));
 
非常感谢znxia,但要选择多行必须按shift键来选,这样只能选择连续的记录,如果想选择不连续的记录怎么办?
 
按Ctrl键,呵呵
 
这样似乎可以,但总觉没有用选项框直观。
 
可以这样实现,dbgrideh1增加一列作为第一列,它不指向任何字段然后在dbgrideh1的自画时画上就可以了,用一个全局的List来记录当前选中的行,我这里用记录号,实际使用时你可以用其它主键就可以了.var Form1: TForm1; FList: TStrings; //用来记住哪些行是选中了implementation{$R *.dfm}procedure TForm1.FormCreate(Sender: TObject);begin FList:= TStringList.Create;end;procedure TForm1.FormDestroy(Sender: TObject);begin FList.Free;end;procedure TForm1.DBGridEh1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);var k: integer; s: string;begin //这里用记录号只是为了测试,实际使用时应该用唯一的主键字段值, if DBGridEh1.SelectedIndex <> 0 then exit; s:= IntToStr(DBGridEh1.DataSource.DataSet.RecNo); k:= FList.IndexOf(s); if k>=0 then FList.Delete(k) else FList.Add(s);end;procedure TForm1.DBGridEh1DrawColumnCell(Sender: TObject; const Rect: TRect; DataCol: Integer; Column: TColumnEh; State: TGridDrawState);var k: integer; s: string;begin if Column.Index <> 0 then exit; with DBGridEh1 do begin Canvas.FillRect(Rect); s:= IntToStr(DataSource.DataSet.RecNo); if FList.IndexOf(s)>=0 then //选中了就自已画上一个打勾的图标 Canvas.StretchDraw(Rect, image1.Picture.Bitmap) end;end;
 
好方法。画图不如直接输出字符“√”
 
按djrj的方法,可以画上图标,但选择多行时还是要按Ctrl键,否则只能选择一行,如何将CheckBox列与其他列进行关联?
 
按djrj的方法搞定,作简单修改如下:procedure TForm1.DBGridEh1DrawColumnCell(Sender: TObject; const Rect: TRect; DataCol: Integer; Column: TColumnEh; State: TGridDrawState);var k: integer; s: string;begin if Column.Index <> 0 then exit; with DBGridEh1 do begin Canvas.FillRect(Rect); s:= IntToStr(DataSource.DataSet.RecNo); if FList.IndexOf(s)>=0 then //选中了就自已画上一个打勾的图标 Canvas.Draw(Rect.Left+Trunc((Columns[0].width-Image1.Pictrue.Bitmap.Width)/2),rect.Top+Trunc((RowHeight-image1.Picture.Bitmap.Width)/2),image1.Picture.Bitmap) else Canvas.Draw(Rect.Left+Trunc((Columns[0].width-Image1.Pictrue.Bitmap.Width)/2),rect.Top+Trunc((RowHeight-image1.Picture.Bitmap.Width)/2),image1.Picture.Bitmap);//使的图片不填充居中。 end;end;
 
后退
顶部