DBGRID自定义数据字段显示(导出)实现一例
在同城系统开发实践中,碰到这样的一种情况,对于相同的数据集,有的区局需要将该数据集导出到EXCEL,但各自需要不同的字段。当然,我们可以在程序中针对各个区的网点编号来设置字段的属性来控制其显示或导出,但程序显得僵硬化,不利于程序的修改。在这里,我提供了一种方法,可以将要显示的字段以菜单的形式加以控制,并以配置文件的形式记录你的个性要求,灵活地控制数据集合的显示或导出字段。
程序分为以下步骤进行:
一、查询数据,动态生成控制菜单。
procedure Tc_BKPenaltyFrm.InitMenuItem;
var
NewItem: TMenuItem;
i: integer;
begin
PopupMenu6.Items.Clear;
for i := 0 to DBGrideh3.Columns.Count - 1 do
begin
NewItem := TMenuItem.Create(nil);
NewItem.Caption := DBGrideh3.Columns.Items[i].Title.Caption;
NewItem.OnClick := MenuOnClick; //添加弹出菜单子项的方法
NewItem.Checked := true;
PopupMenu6.Items.Add(NewItem);
end;
end;
二、读取配置文件,控制数据字段属性
procedure Tc_BKPenaltyFrm.SetFromIni;
var
Listini: Tinifile;
list: string;
ts: Tstringlist;
i: integer;
begin
//读入非显示字段的下标列表。
try
Listini := TIniFile.Create(ExtractFilePath(ParamStr(0)) + 'ini/config.ini');
list := Listini.ReadString('explist', 'list', '');
finally
Listini.Free;
end;
ts := TStringList.Create;
ts.Delimiter := ',';
ts.DelimitedText := list;
//按列表内容,控制字段的属性
for i := 0 to ts.Count - 1 do
begin
PopupMenu6.Items[StrToInt(ts[i])].Click; //触发菜单单击事件
end;
end;
//菜单单击,控制显示
procedure Tc_BKPenaltyFrm.MenuOnClick(Sender: TObject);
begin
inherited;
TMenuItem(Sender).Checked := not TMenuItem(Sender).Checked;//取反
SetToIni; //写入配置文件
DBGridDisplayInf;//控制字段属性
end;
//控制菜单项对应的字段属性,决定显示或导出的属性
procedure Tc_BKPenaltyFrm.DBGridDisplayInf;
var
i: integer;
begin
for i := 0 to PopupMenu6.Items.Count - 1 do
begin
if not PopupMenu6.Items[i].Checked then
begin
DBGrideh3.Columns.Items[i].Visible := false; //不显示
DBGrideh5.Columns.Items[i].Visible := false;
DBGrideh5.DataSource.DataSet.FieldByName(DBGrideh5.Columns.Items[i].Title.Caption).Tag := 1;//该属性控制导出EXCEL时该字段不导出
end
else
begin
DBGrideh3.Columns.Items[i].Visible := true; //显示
DBGrideh5.Columns.Items[i].Visible := true;
DBGrideh5.DataSource.DataSet.FieldByName(DBGrideh5.Columns.Items[i].Title.Caption).Tag := 0; //该属性控制导出EXCEL时该字段时导出
end;
end;
end;
//写入配置文件。
procedure Tc_BKPenaltyFrm.SetToIni;
var
Listini: Tinifile;
list: string;
i: integer;
begin
//遍历菜单项,把所有非选的项目的下标添加到List里面。
for i := 0 to PopupMenu6.Items.Count - 1 do
begin
if not PopupMenu6.Items[i].Checked then
begin
list := list + inttostr(i) + ',';
end;
end;
list := copy(list, 1, length(list) - 1);
//把非选的项目写入配置文件。
try
Listini := TIniFile.Create(ExtractFilePath(ParamStr(0)) + 'ini/config.ini');
Listini.WriteString('explist', 'list', list);
finally
Listini.Free;
end;
end;