做的一个项目中,dbgrideh某一列点击标题排序,出现莫名其妙的问题,排出顺序根本不对,乱七八糟。
最后发现是 adoquery的sql语句问题:
select a.*,b.*,c.* from a left outer join b on a.电表ID=b.电表ID
left outer join c on a.电表ID= c.电表ID
adoquery中就会有3个电表ID的字段,当我重新优化sql语句只保留一个电表ID后,点击标题排序正常!
我认为在dbgrideh的TitleBtnClick事件里的参数Column应该可以正确识别出是哪个电表ID,难道是dbgrideh的BUG?
-----------------------------------------------------------------
顺便记两个有关标题排序的东西
1、设置dghAutoSortMarking属性为true
2、设置希望排序的Column的TitleButton属性为true
3、uses列表中增加EhlibAdo
这样就可以了,不需要写代码。
这种做法的确简单省事,但弊病是速度慢,它应该是将dbgrideh关联的数据集控件的sql语句加上“order by field”
然后重新关闭打开数据集。如果你的sql语句中有 order by 的话,dbgrideh点击标题就会报错
-----------------------------------------------------------------
最后发现是 adoquery的sql语句问题:
select a.*,b.*,c.* from a left outer join b on a.电表ID=b.电表ID
left outer join c on a.电表ID= c.电表ID
adoquery中就会有3个电表ID的字段,当我重新优化sql语句只保留一个电表ID后,点击标题排序正常!
我认为在dbgrideh的TitleBtnClick事件里的参数Column应该可以正确识别出是哪个电表ID,难道是dbgrideh的BUG?
-----------------------------------------------------------------
顺便记两个有关标题排序的东西
1、设置dghAutoSortMarking属性为true
2、设置希望排序的Column的TitleButton属性为true
3、uses列表中增加EhlibAdo
这样就可以了,不需要写代码。
这种做法的确简单省事,但弊病是速度慢,它应该是将dbgrideh关联的数据集控件的sql语句加上“order by field”
然后重新关闭打开数据集。如果你的sql语句中有 order by 的话,dbgrideh点击标题就会报错
-----------------------------------------------------------------
procedure TFrmDBCZ_CZCBSH.DBGridEh_DJTitleBtnClick(Sender: TObject;
ACol: Integer; Column: TColumnEh);
begin
inherited;
SortDBGridEh(Sender,ACol,Column);
end;
procedure SortDBGridEh(Sender: TObject; ACol: Integer; Column: TColumnEh);
var
FieldName : string ;
SortStr : string ;
begin
Screen.Cursor : = crSQLWait;
try
if (Sender is TDBGridEh) and ((Sender as TDBGridEh).DataSource.DataSet <> nil) then
begin
if not ((Sender as TDBGridEh).DataSource.DataSet is TCustomADODataSet) then
Exit;
if not (Sender as TDBGridEh).DataSource.DataSet.Active then
Exit;
FieldName : = Column.FieldName;
if (Sender as TDBGridEh).DataSource.DataSet.FindField(FieldName).IsBlob then
Exit;
if (Sender as TDBGridEh).DataSource.DataSet.FieldByName(FieldName).FieldKind = fkData then
SortStr : = FieldName
else if (Sender as TDBGridEh).DataSource.DataSet.FieldByName(FieldName).FieldKind = fkLookup then
FieldName : = (Sender as TDBGridEh).DataSource.DataSet.FieldByName(FieldName).KeyFields
else
FieldName : = '' ;
if (FieldName = '' ) or (Pos( ' ; ' , FieldName) > 0 ) then
Exit;
case Column.Title.SortMarker of
smNoneEh:
begin
TCustomADODataSet((Sender as TDBGridEh).DataSource.DataSet).Sort : = FieldName + ' DESC ' ;
end;
smUpEh:
begin
TCustomADODataSet((Sender as TDBGridEh).DataSource.DataSet).Sort : = FieldName + ' DESC ' ;
end;
smDownEh:
begin
TCustomADODataSet((Sender as TDBGridEh).DataSource.DataSet).Sort : = FieldName;
end;
end;
end;
finally
Screen.Cursor : = crDefault;
end;
end;
ACol: Integer; Column: TColumnEh);
begin
inherited;
SortDBGridEh(Sender,ACol,Column);
end;
procedure SortDBGridEh(Sender: TObject; ACol: Integer; Column: TColumnEh);
var
FieldName : string ;
SortStr : string ;
begin
Screen.Cursor : = crSQLWait;
try
if (Sender is TDBGridEh) and ((Sender as TDBGridEh).DataSource.DataSet <> nil) then
begin
if not ((Sender as TDBGridEh).DataSource.DataSet is TCustomADODataSet) then
Exit;
if not (Sender as TDBGridEh).DataSource.DataSet.Active then
Exit;
FieldName : = Column.FieldName;
if (Sender as TDBGridEh).DataSource.DataSet.FindField(FieldName).IsBlob then
Exit;
if (Sender as TDBGridEh).DataSource.DataSet.FieldByName(FieldName).FieldKind = fkData then
SortStr : = FieldName
else if (Sender as TDBGridEh).DataSource.DataSet.FieldByName(FieldName).FieldKind = fkLookup then
FieldName : = (Sender as TDBGridEh).DataSource.DataSet.FieldByName(FieldName).KeyFields
else
FieldName : = '' ;
if (FieldName = '' ) or (Pos( ' ; ' , FieldName) > 0 ) then
Exit;
case Column.Title.SortMarker of
smNoneEh:
begin
TCustomADODataSet((Sender as TDBGridEh).DataSource.DataSet).Sort : = FieldName + ' DESC ' ;
end;
smUpEh:
begin
TCustomADODataSet((Sender as TDBGridEh).DataSource.DataSet).Sort : = FieldName + ' DESC ' ;
end;
smDownEh:
begin
TCustomADODataSet((Sender as TDBGridEh).DataSource.DataSet).Sort : = FieldName;
end;
end;
end;
finally
Screen.Cursor : = crDefault;
end;
end;