1、我看到一些软件是,按一下DBGrid上的字段,就可以按该字段的升序排,再按一下又按文书字段的降序排,这是怎么做的?
2、如果有一个EDIT和一个"查询"按钮和一个DBgrid窗口,我想在EDIT中输入数字,按下"查询"按钮后,在DBGrid中就显示到查询的此行,怎么做?
2、如果有一个EDIT和一个"查询"按钮和一个DBgrid窗口,我想在EDIT中输入数字,按下"查询"按钮后,在DBGrid中就显示到查询的此行,怎么做?
var
OrderString : string;
begin
if Column.ID > 3 then
Exit;
if(Column.Field.FieldName = 'No') then
OrderString:=' ORDER BY FETALFIL."NO" ';
if(Column.Field.FieldName = 'Name') then
OrderString:=' ORDER BY FETALFIL."NAME" ';
if(Column.Field.FieldName = 'OLD') then
OrderString:=' ORDER BY FETALFIL."OLD" ';
if(Column.Field.FieldName = 'YZ') then
OrderString:=' ORDER BY FETALFIL."YZ" '; Column.Title.Font.Color:= clMaroon;
with FetalFilQuery do
begin
Close;
SQL.Clear;
SQL.Add(SQLString+OrderString);
Open;
last;
end;
end;
第二个问题
用Locate
2:还没找到好的方法:
dbgrid.disablecontrol;
dbgrid.datasource.dataset.first;
i:=1;
while not dbgrid.datasource.dataset.eof do
begin
if i=num then
break
else i:=i+1;
dbgrid.datasource.dataset.next
end;
dbgrid.enablecontrol;
Var
DataSet: TDataSet;
FieldNames:String;
Begin
if Column.Field=nil then Exit;
if not Column.Field.DataSet.Active then Exit;
if not (Column.Field.FieldKind in [fkData,fkLookup]) then exit;
DataSet := Column.Field.DataSet;
if Column.Field.Lookup then
FieldNames:= Column.Field.KeyFields
else
FieldNames:=Column.Field.FieldName; if DataSet is TCustomDataSet then
with TCustomDataSet(DataSet) do
begin
if (Pos(FieldNames, Sort) = 1) and (Pos(' DESC', Sort) = 0) then
Sort := FieldNames + ' DESC' else
Sort := FieldNames + ' ASC';
end;
end;在DBGrid的OnTitleClick事件中调用OrderGrid(Column)就行了。
这句怎么解释?
if DataSet is TCustomDataSet then在这一句上出错,提示:[Error] Unit1.pas(175): Undeclared identifier: 'TCustomDataSet'.
另外,Sort你没定义啊?
这句意思是:如果字段的类型不是fkData或fkLookup类型才可以排序。
另外Sort应该定义成什么呢?
OrderString:=' ORDER BY FETALFIL."YZ" ';中的FETALFIL是什么意思?你所写的好像只能按一种顺序排序吧!我要求的是按一下“升序”再按一下“降序”
功能强大。这个问题一般的解决方法是有一个变量(boolean变量或其他)来保存点击的状态
通过它来判断是正序还是逆序。然后做相应的排序操作。以bdeClientDataSet为例(名字设 为cds_1);
先加索引:
cds_1.addindex('index1','field1','');//这是正序
cds_1.addindex('index1desc','field1',[ixDescending]);//这是逆序
然后如果要对cds_1排序,指定使用哪个索引就行了
cds_1.indexname:=‘index1’//调用刚才的正序索引,按field1正序排列
cds_1.indexname;='index1des'
第二个问题,使用filter,以ClientDAtaSet为例(query1也行),
dbgrid连到clientdataset上,在click事件中写到
clientdataset1.filtered:=false;
clientdataset1.filter:='field1='+edit1.text;
clientdataset1.filtered:=true;
关于bdeclientdataset和clientdataset更详细的使用信息,请看delphi帮助
'师父带进门,修行靠个人'
var
SqlStr,myFieldName,TempStr: string;
OrderPos: integer;
SavedParams: TParams;
begin
if not (Column.Field.FieldKind in [fkData,fkLookup]) then exit;
if Column.Field.FieldKind =fkData then
myFieldName := UpperCase(Column.Field.FieldName)
else
myFieldName := UpperCase(Column.Field.KeyFields);
while Pos(myFieldName,';')<>0 do
myFieldName := copy(myFieldName,1,Pos(myFieldName,';')-1)
+ ',' + copy(myFieldName,Pos(myFieldName,';')+1,100);
with TQuery(TDBGrid(Column.Grid).DataSource.DataSet) do
begin
SqlStr := UpperCase(Sql.Text);
if ParamCount>0 then
begin
SavedParams := TParams.Create;
SavedParams.Assign(Params);
end;
OrderPos := pos('ORDER',SqlStr);
if (OrderPos=0) or
(pos(myFieldName,copy(SqlStr,OrderPos,100))=0) then
TempStr := ' Order By ' + myFieldName + ' Asc'
else if pos('ASC',SqlStr)=0 then
TempStr := ' Order By ' + myFieldName + ' Asc'
else
TempStr := ' Order By ' + myFieldName + ' Desc';
if OrderPos<>0 then SqlStr := Copy(SqlStr,1,OrderPos-1);
SqlStr := SqlStr + TempStr;
Active := False;
Sql.Clear;
Sql.Text := SqlStr;
if ParamCount>0 then
begin
Params.AssignValues(SavedParams);
SavedParams.Free;
end;
Prepare;
Open;
end;
end;