DBgridEh增加一个checkbox列的问题(100)

  • 主题发起人 主题发起人 motorola168
  • 开始时间 开始时间
M

motorola168

Unregistered / Unconfirmed
GUEST, unregistred user!
我先在DBgridEh增加一个checkbox列,这个列在数据库表中实际不存在,然后我可以根据这个列来判断当前记录是否被选中,该怎样做?我在DBgrideh中增加了一列,checkbox熟悉你跟设置为true但是在实际运行中这个列的checkbox不能被选中,就是说不能编辑.
 
数据库必须要实际存在bit类型的列,否则行不通
 
有人知道不存在实际列怎么做吗,分可以再加
 
你说的完全可以做到,我就是这么做的。两种方法: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 //&sup2;&raquo;&Ecirc;&Ccedil;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。接下去应该容易了吧。。。。
 
cds2.data:=数据库的数据cds1.fielddef:=cds2.fieldDef;cds1.fielddef.add('s',ftboolean,0);cds1.createdataset;cds1.data:=cds2.data
 
在select的时候,写上一个虚拟字段也可以吧?
 
在select的时候加上一个虚拟字段怎么做呢?
 
参考如下代码procedure TForm1.DBGridEh1CellClick(Column: TColumnEh);beginif column.FieldName='sohu' thenbeginadodataset1.Edit;if adodataset1.FieldByName(column.FieldName).AsString='1' then adodataset1.FieldByName(column.FieldName).AsString:='0' else adodataset1.FieldByName(column.FieldName).AsString:='1';adodataset1.Post;end;end;========with clientDataset1 dobeginactive:=false;fields.Clear;fielddefs.Clear;commandtext:=sqlstrl;fielddefs.update;with Tfielddef(fielddefs.Insert(0)) dobegin name:='sohu'; DATATYPE:=FTBOOLEAN; DISPLAYNAME:='选择';end;for i:=0 to fielddefs.count-1 do fielddefs.CreateField(clientDataset1);fields[0].FieldKind:=fkinternalcalc;execute;active:=true;end;with dbgrideh1 dobegin columns[0].Checkboxes:=true; columns[0].KeyList.clear; columns[0].KeyList.add('1'); columns[0].KeyList.add('0'); columns[0].AlwaysShowEditButton:=true;end;
 
我用的ADOQUERY,可以编辑CHECKBOX,但是当记录移动到另外一条时。还是不会勾上我选择了的记录
 
把 DisplayUnchecked 设为 False ImmediatePost 设为 True Nullstyle 设为 nssUnckeckedReadonly 设为 False
 
搂上的你说的这些属性具体是指哪个对象的属性啊
 
多人接受答案了。
 
后退
顶部