DBGridEh自定义显示问题! ( 积分: 200 )

  • 主题发起人 主题发起人 lynch2611
  • 开始时间 开始时间
L

lynch2611

Unregistered / Unconfirmed
GUEST, unregistred user!
DBGridEh中某列的数据我想自己控制来显示,控制过程为一个复杂的运算且涉及到数据库的查询!
请给点提示!或者相关的贴子(DFW的检索又出问题了)

我的意思是DBGridEh中某列的FieldName不设置,该列显示的内容由我自己来计算(复杂的计算,直接SQL语句计算不行)得到,然后显示.
我说计算的复杂是还想考虑到只计算一次,不要每次DBGridEh一刷新就要再算一次,
该列的值最好可以读取到!
 
procedure TFmPlanBillBase.SetDisplayFormat(ACtrlData: TClientDataSet;
GridEH: TDBGridEH; bCtrl: boolean);
var
i, iFreeze: integer;
s: string;
begin
iFreeze := 0;
if ACtrlData.RecordCount <= 0 then Exit;
ACtrlData.DisableControls;
try
try
GridEH.ShowHint := True;
GridEh.Columns.Clear;
for i := 0 to ACtrlData.RecordCount - 1 do
begin
if ACtrlData.FieldByName('SBF_DisplayInGrid').AsString = '1' then //在表格中显示
with GridEH.Columns.Add do
begin
FieldName := ACtrlData.FieldByName('SBF_FieldName').AsString;
if FieldName <> 'BF_ItemFlag' then
begin
if (Pos('Flag', FieldName) > 0) and (FieldName <> SubmitField) and
(FieldName <> EndField)then
begin
Checkboxes := True; //显示复选框
KeyList.Add('1'); //显示选择状态的值
KeyList.Add('0'); //显示不选择状态的值
end;
end;
DisplayFormat := ACtrlData.FieldByName('SBF_DisplayFormat').AsString;
Title.Caption := ACtrlData.FieldByName('SBF_Caption').AsString; //字段中文标题
Title.Hint := ACtrlData.FieldByName('SBF_Hint').AsString;
Width := ACtrlData.FieldByName('SBF_Width').AsInteger;
ReadOnly := ACtrlData.FieldByName('SBF_ReadOnly').AsString = '1'; //只读

if ACtrlData.FieldByName('SBF_IsChiInput').AsString = '1' then
begin
ImeName := ChnIme;
ImeMode := imOpen;
end else
ImeMode := imClose;

//冻结列数
if ACtrlData.FieldByName('SBF_IsFrozen').AsString = '1' then
iFreeze := iFreeze + 1;

if ACtrlData.FieldByName('SBF_IsSum').AsString = '1' then //求和
begin
if not (GridEh.FooterRowCount = 1) then
GridEh.FooterRowCount := 1;
Footer.FieldName := FieldName;
Footer.ValueType := fvtSum;
Footer.Alignment := taRightJustify;
Footer.DisplayFormat := DisplayFormat;
end;
end;
ACtrlData.Next;
end;
GridEH.FrozenCols := iFreeze;
if GridEh.FooterRowCount = 1 then
SetFooterOfDBGridEh(GridEH);
except
on E: Exception do
SaveLog('设置显示格式时出错:' + E.Message);
end;
finally
ACtrlData.EnableControls;
end;
end;
procedure TFmPlanBillBase.SetFooterOfDBGridEh(ADBGridEh: TDBGridEh);
begin
with ADBGridEh do
begin
//if FooterRowCount = 1 then Exit;
FooterColor := clSilver;
with FooterFont do
begin
Name := 'Tahoma';
Size := 8;
Style := [fsBold];
end;
with SumList do
begin
VirtualRecords := True;
Active := True;
end;
with Columns[0].Footer do
begin
ValueType := fvtStaticText;
Value := '合计:';
end;
end;
end;

供你参考一下,我自己写的.
CtrlData就是从数据库里查询出来的字段控件信息.
 
将列宽度置为0可以吗?DBGridEh.Column[0].Width=0
 
to happycyp:
谢谢先!
可能我表达的不好,我的意思是DBGridEh中某列的FieldName不设置,该列显示的内容由我自己来计算(复杂的计算,直接SQL语句计算不行)得到,然后显示.
我说计算的复杂是还想考虑到只计算一次,不要每次DBGridEh一刷新就要再算一次,
该列的值最好可以读取到!
 
这是我以前做的程序,希望对你我有帮助。
Data.ADOQ1.Close ;
Data.ADOQ1.SQL.Clear ;
Data.ADOQ1.SQL.Add('select * from BM_MONEY order by qk,cw,sd ') ;
Data.ADOQ1.Active := True ;
if Data.ADOQ1.RecordCount >0 then
begin
DBGridEh1.Columns[0].Title.Caption :=' 区 块 ' ;
DBGridEh1.Columns[1].Title.Caption :=' 层 位 ' ;
DBGridEh1.Columns[2].Title.Caption :=' 深 度 ' ;
DBGridEh1.Columns[3].Title.Caption :=' 流 压|自喷、注水' ;
DBGridEh1.Columns[4].Title.Caption :=' 流 压| 抽 油 ' ;
DBGridEh1.Columns[5].Title.Caption :=' 探井底、深通 |自喷、注水' ;
DBGridEh1.Columns[6].Title.Caption :=' 探井底、深通 | 抽 油 ' ;
DBGridEh1.Columns[7].Title.Caption :=' 修井探井底 |自喷、注水' ;
DBGridEh1.Columns[8].Title.Caption :=' 修井探井底 |抽 油 ' ;
DBGridEh1.Columns[9].Title.Caption := ' 梯 度|自喷、注水 ' ;
DBGridEh1.Columns[10].Title.Caption :=' 梯 度| 抽 油 ' ;
DBGridEh1.Columns[11].Title.Caption :=' 梯 度| 不 停 抽 ' ;
DBGridEh1.Columns[12].Title.Caption :=' 复 压|自喷、注水 ' ;
DBGridEh1.Columns[13].Title.Caption :=' 复 压| 抽 油 ' ;
DBGridEh1.Columns[14].Title.Caption :=' 静 压|自喷、注水 ' ;
DBGridEh1.Columns[15].Title.Caption :=' 静 压| 抽油井 ' ;
DBGridEh1.Columns[16].Title.Caption :=' 静 压|抽油井环空 ' ;
DBGridEh1.Columns[17].Title.Caption :=' 取 样|自喷、注水 ' ;
DBGridEh1.Columns[18].Title.Caption :=' 取 样| 抽 油 ' ;
DBGridEh1.Columns[19].Title.Caption :=' 下不去 ' ;
DBGridEh1.Columns[20].Title.Caption :=' 低 压|正常功图' ;
DBGridEh1.Columns[21].Title.Caption :=' 低 压|正常液面 ' ;
DBGridEh1.Columns[22].Title.Caption :=' 低 压|措施功图 ' ;
DBGridEh1.Columns[23].Title.Caption :=' 低 压|措施液面 ' ;
DBGridEh1.Columns[24].Title.Caption :=' 注水井 |投捞水嘴 ' ;
DBGridEh1.Columns[25].Title.Caption :=' 注水井 |检查水嘴 ' ;
DBGridEh1.Columns[26].Title.Caption :=' 注水井 |调试水嘴 ' ;
DBGridEh1.Columns[27].Title.Caption :=' 气井投捞 ' ;
DBGridEh1.Columns[28].Title.Caption :=' 系统试井| 自喷 ' ;
DBGridEh1.Columns[29].Title.Caption :=' 系统试井| 抽油 ' ;
DBGridEh1.Columns[30].Title.Caption :=' 系统试井| 注水 ' ;
DBGridEh1.Columns[31].Title.Caption :=' 抽 油|液面监测 ' ;
DBGridEh1.Columns[32].Title.Caption :=' 抽 油|系统效率 ' ;
DBGridEh1.Columns[33].Title.Caption :=' 探边、干扰(自、注、抽)' ;
DBGridEh1.Columns[34].Title.Caption :=' 分层流量(注水)' ;
DBGridEh1.Columns[35].Title.Caption :=' 分层压力(自、注、抽)' ;
DBGridEh1.Columns[36].Title.Caption :=' 地面直读(自、注、抽)' ;
DBGridEh1.Columns[37].Title.Caption :=' 自喷常规清蜡 ' ;
DBGridEh1.Columns[38].Title.Caption :=' 抽 油|常规热洗 ' ;
DBGridEh1.Columns[39].Title.Caption :=' 抽 油|自能热洗 ' ;
DBGridEh1.Columns[40].Title.Caption :=' 生产测井|产液剖面 ' ;
DBGridEh1.Columns[41].Title.Caption :=' 生产测井|吸水剖面 ' ;
DBGridEh1.Columns[42].Title.Caption :=' 生产测井|工程测试 ' ;
DBGridEh1.Columns[43].Title.Caption :=' 其它测试 ' ;
for i:=0 to 32 do
DBGridEh1.Columns.Width := 70 ; //动态设定字段显示宽度
for i:=38 to 43 do
DBGridEh1.Columns.Width := 70 ;
for i:=34 to 37 do
DBGridEh1.Columns.Width := 145 ;
DBGridEh1.Columns[33].Width := 160 ;
for i:=0 to 43 do
DBGridEh1.Columns.Title.Alignment := taCenter ;
for i:=0 to 43 do
DBGridEh1.Columns.Title.Font.Name := '宋体' ;
for i:=0 to 43 do
DBGridEh1.Columns.Title.Font.Size := 9 ;
for i:=0 to 43 do
DBGridEh1.Columns.Title.TitleButton := True ; //动态设定标题行命令按钮为 True ;
 
用DataSet的计算字段可以不?
 
to lake_cx:
你是说,DBGridEh中某列的FieldName照样设置,在DataSet获取到数据的时候,把FieldName的字段计算下 是吧?
有小例子看看吗?
谢谢!
 
设计时加计算字段(fkCalculated),在OnCalcFields事件给你的计算字段赋值就行了啊。具体怎么计算就是你代码写的了
 
后退
顶部