當數據集有選擇的時候,比如選擇性打印,而且這種選擇是隨用戶的主觀意念決定時。在DBGrid上設置選擇項,就非常必要和非常有用了。
在DBGrid上設置選擇項,操作如下:
一、加入DB單元,因爲要DB相關設置。
uses DB;
二、在Table的字段設置一個可供選擇的字段,例使用中文字段“選擇”,屬性:bit。
三、顯示Table的DBGrid中,將該字段設置爲第1列,即DBGrid1.Columns.Items[0]。DBGrid初始化時加入下列代碼:
DBGrid3.DataSource.DataSet.Fields[0].DisplayLabel:='√'; // 設置選擇列顯示名稱
DBGrid3.Columns.Items[0].Width:=DBGrid1.Canvas.TextWidth('123'); // 設置選擇列寬度
四、在DBGrid1CellClick事件中,使用下列代碼。功能是隻要鼠標點擊“選擇”列,其Boolean值爲原值的反值。
procedure TPrintTableFrm.DBGrid1CellClick(Column: TColumn);
begin
if DBGrid1.SelectedField.DataType=ftboolean then
begin
with DBGrid1.DataSource.DataSet do
begin
Edit;
DBGrid1.SelectedField.AsBoolean:=not DBGrid1.SelectedField.AsBoolean;
Post;
DBGrid1.Options:=DBGrid1.Options-[dgEditing];
end;
end
else begin
if DBGrid1.SelectedField.DataType<>ftboolean then
DBGrid1.Options:=DBGrid1.Options+[dgEditing];
end;
end;
五、在DBGrid1DrawColumnCell事件中,使用下列代碼。功能就是重新畫“選擇”列上的字符。
procedure TPrintTableFrm.DBGrid1DrawColumnCell(Sender: TObject;
const Rect: TRect; DataCol: Integer; Column: TColumn;
State: TGridDrawState);
const
CtrlState: array[Boolean] of Integer = (DFCS_BUTTONCHECK, DFCS_BUTTONCHECK or DFCS_CHECKED);
begin
if Column.Field.DataType = ftBoolean then
begin
DBGrid1.Canvas.FillRect(Rect);
DrawFrameControl(DBGrid1.Canvas.Handle,
Rect,
DFC_BUTTON,
CtrlState[Column.Field.AsBoolean]);
end;
end;
六、在DBGrid1TitleClick事件中,使用下列代碼。功能就是隻要鼠標點擊“選擇”列的標題,可以設置“全選”或“全非”。
procedure TPrintTableFrm.DBGrid1TitleClick(Column: TColumn);
var i:integer;
begin
if column.Index=0 then //驗證是否第一列
begin
DBGrid1.DataSource.DataSet.DisableControls;
DBGrid1.DataSource.DataSet.First; //遊標回滾
DBGrid1.SelectedRows.CurrentRowSelected:=true; //第一行被選中
if trim(column.Title.Caption)='√' then
begin
for i:=0 to dbgrid1.DataSource.DataSet.RecordCount-1 do
begin
dbgrid1.Fields[0].DataSet.edit;
dbgrid1.Fields[0].AsBoolean:=true;
dbgrid1.Fields[0].DataSet.post;
dbgrid1.datasource.dataset.next;
end;
column.Title.Caption:='×';
end
else begin
for i:=0 to dbgrid1.DataSource.DataSet.RecordCount-1 do
begin
dbgrid1.Fields[0].DataSet.edit;
dbgrid1.Fields[0].AsBoolean:=false;
dbgrid1.Fields[0].DataSet.post;
dbgrid1.datasource.dataset.next;
end;
column.Title.Caption:='√';
end;
DBGrid1.DataSource.DataSet.First; //遊標回滾
DBGrid1.SelectedRows.CurrentRowSelected:=true; //選中第一行
DBGrid1.DataSource.DataSet.EnableControls;
end;
end;
通過上述代碼設置,編譯可見效果圖