Ordenação no DBGrid
Boa noite amigos, mais uma vez preciso da ajuda de vocês.
Pelo Curso do Guinter sobre segredos do DBGrid vi como ordernar usando o IndexFieldNames do ClientDataSet, mas acontece que qdo ordenado uma vez, se eu clicar novamente na mesma coluna ele não reordena, como faço para ele reordernar?
Abraços,
Rogério
Pelo Curso do Guinter sobre segredos do DBGrid vi como ordernar usando o IndexFieldNames do ClientDataSet, mas acontece que qdo ordenado uma vez, se eu clicar novamente na mesma coluna ele não reordena, como faço para ele reordernar?
Abraços,
Rogério
Rogério Nascimento
Curtidas 0
Respostas
Wesley Yamazack
07/07/2009
Olá meu caro,
Segue uma função para te ajudar.
//função
procedure TForm1.OrdenaDataSetGrid(
var CDS: TClientDataSet; Column: TColumn; var dbgPrin: TDBGrid);
const
idxDefault = 'DEFAULT_ORDER';
var
strColumn : string;
i : integer;
bolUsed : boolean;
idOptions : TIndexOptions;
begin
strColumn := idxDefault;
if Column.Field.FieldKind in [fkCalculated, fkLookup, fkAggregate] then
Exit;
if Column.Field.DataType in [ftBlob, ftMemo] then
Exit;
for i := 0 to dbgPrin.Columns.Count -1 do
dbgPrin.Columns[i].Title.Font.Style := [];
bolUsed := (Column.Field.FieldName = CDS.IndexName);
CDS.IndexDefs.Update;
for i := 0 to CDS.IndexDefs.Count - 1 do
begin
if CDS.IndexDefs.Items[i].Name = Column.Field.FieldName then
begin
strColumn := Column.Field.FieldName;
case (CDS.IndexDefs.Items[i].Options = [ixDescending]) of
true : idOptions := [];
false : idOptions := [ixDescending];
end;
end;
end;
if (strColumn = idxDefault) or (bolUsed) then
begin
if bolUsed then
CDS.DeleteIndex(Column.Field.FieldName);
try
CDS.AddIndex(Column.Field.FieldName, Column.Field.FieldName,idOptions, '', '', 0);
strColumn := Column.Field.FieldName;
except
if bolUsed then
strColumn := idxDefault;
end;
end;
try
CDS.IndexName := strColumn;
Column.Title.Font.Style := [fsbold];
except
CDS.IndexName := idxDefault;
end;
end;
no Evento onTitleClick do teu DBGRID faça o seguinte
OrdenaDataSetGrid(ClientDataSet1,Column,DBGrid1);
Com isso acho que você mata teu problema.
Att,
Wesley Y
Segue uma função para te ajudar.
//função
procedure TForm1.OrdenaDataSetGrid(
var CDS: TClientDataSet; Column: TColumn; var dbgPrin: TDBGrid);
const
idxDefault = 'DEFAULT_ORDER';
var
strColumn : string;
i : integer;
bolUsed : boolean;
idOptions : TIndexOptions;
begin
strColumn := idxDefault;
if Column.Field.FieldKind in [fkCalculated, fkLookup, fkAggregate] then
Exit;
if Column.Field.DataType in [ftBlob, ftMemo] then
Exit;
for i := 0 to dbgPrin.Columns.Count -1 do
dbgPrin.Columns[i].Title.Font.Style := [];
bolUsed := (Column.Field.FieldName = CDS.IndexName);
CDS.IndexDefs.Update;
for i := 0 to CDS.IndexDefs.Count - 1 do
begin
if CDS.IndexDefs.Items[i].Name = Column.Field.FieldName then
begin
strColumn := Column.Field.FieldName;
case (CDS.IndexDefs.Items[i].Options = [ixDescending]) of
true : idOptions := [];
false : idOptions := [ixDescending];
end;
end;
end;
if (strColumn = idxDefault) or (bolUsed) then
begin
if bolUsed then
CDS.DeleteIndex(Column.Field.FieldName);
try
CDS.AddIndex(Column.Field.FieldName, Column.Field.FieldName,idOptions, '', '', 0);
strColumn := Column.Field.FieldName;
except
if bolUsed then
strColumn := idxDefault;
end;
end;
try
CDS.IndexName := strColumn;
Column.Title.Font.Style := [fsbold];
except
CDS.IndexName := idxDefault;
end;
end;
no Evento onTitleClick do teu DBGRID faça o seguinte
OrdenaDataSetGrid(ClientDataSet1,Column,DBGrid1);
Com isso acho que você mata teu problema.
Att,
Wesley Y
GOSTEI 0
Rogério Nascimento
07/07/2009
Rapaz, tu caiu do céu, valeu mais uma vez !!!!!
Abraços,
Rogério
Abraços,
Rogério
GOSTEI 0
Wesley Yamazack
07/07/2009
Que nada meu amigo, estamos aqui a disposição!
Se precisar só postar que agente resolve.
Abraço,
Wesley Y
Se precisar só postar que agente resolve.
Abraço,
Wesley Y
GOSTEI 0