Fórum DBGrid #408664

21/10/2011

0

Como posso criar opção para Classificar e ocultar uma coluna no DBGrid?   Como acontece no access, você clica no nome da coluna com o botão direito e aparece opção Classificar A/Z ou Z/A, Ocultar coluna...   Uso ADOQuery banco Access.
Paulo Andrade

Paulo Andrade

Responder

Posts

21/10/2011

Gustavo Bretas

Paulo, se vc usar somente o componente ADOQuery, vc ter que refazer o Select toda vez que precisar ordenar a Grid.

Então vc pode acrescentar um ClientDataSet e usar a propriedade IndexNamem, como no exemplo abaixo:

procedure TForm1.DBGrid1TitleClick(Column: TColumn);
var
  vlbMesmoCampo: Boolean;
  vloIndices: TStrings;
  vliCont: Integer;
begin
  inherited;
  try
    vlbMesmoCampo := False;
    vloIndices := TStringList.Create;
    ClientDataSet1.GetIndexNames(vloIndices);
    ClientDataSet1.IndexName := EmptyStr;
    vliCont := vloIndices.IndexOf(idx + Column.FieldName);
    if vliCont >= 0 then
    begin
      vlbMesmoCampo := not (ixDescending in ClientDataSet1.IndexDefs[vliCont].Options);
      ClientDataSet1.DeleteIndex(idx + Column.FieldName);
    end;
    ClientDataSet1.AddIndex(idx + Column.FieldName, Column.FieldName, [], IfThen(vlbMesmoCampo, Column.FieldName));
    ClientDataSet1.IndexName := idx + Column.FieldName;
  finally
    FreeAnNil(vloIndices);
  end;
end;


Talvez não seja o melhor exemplo, mas funciona perfeitamente aqui pra mim!

Att
Responder

Gostei + 0

25/10/2011

Paulo Andrade

Como poderia usar ClientDataSet com componentes ADO banco Access?

Paulo, se vc usar somente o componente ADOQuery, vc ter que refazer o Select toda vez que precisar ordenar a Grid.

Então vc pode acrescentar um ClientDataSet e usar a propriedade IndexNamem, como no exemplo abaixo:

procedure TForm1.DBGrid1TitleClick(Column: TColumn);
var
  vlbMesmoCampo: Boolean;
  vloIndices: TStrings;
  vliCont: Integer;
begin
  inherited;
  try
    vlbMesmoCampo := False;
    vloIndices := TStringList.Create;
    ClientDataSet1.GetIndexNames(vloIndices);
    ClientDataSet1.IndexName := EmptyStr;
    vliCont := vloIndices.IndexOf(idx + Column.FieldName);
    if vliCont >= 0 then
    begin
      vlbMesmoCampo := not (ixDescending in ClientDataSet1.IndexDefs[vliCont].Options);
      ClientDataSet1.DeleteIndex(idx + Column.FieldName);
    end;
    ClientDataSet1.AddIndex(idx + Column.FieldName, Column.FieldName, [], IfThen(vlbMesmoCampo, Column.FieldName));
    ClientDataSet1.IndexName := idx + Column.FieldName;
  finally
    FreeAnNil(vloIndices);
  end;
end;


Talvez não seja o melhor exemplo, mas funciona perfeitamente aqui pra mim!

Att
Responder

Gostei + 0

26/10/2011

Gustavo Bretas

Como poderia usar ClientDataSet com componentes ADO banco Access?


Paulo, como em qualquer outro Banco, informe a ADOQuery para o DataSetProvider, e o DataSetProvider para o ClientDataSet, depois trabalhe direto no ClientDataSet, se o select tiver parâmetros, clique com o botão direito do mouse no ClientDataSet e selecione Fetch Params, ele vai copiar todos os parâmetros da Query, então ao invés de setar os parâmetros e abrir a Query vc seta os parâmetros no ClientDataSet e abre por ele!

Att
Responder

Gostei + 0

26/10/2011

Paulo Andrade

#Concluido

Valeu a dica amigão, funcionou perfeitamente... obrigado!


Como poderia usar ClientDataSet com componentes ADO banco Access?


Paulo, como em qualquer outro Banco, informe a ADOQuery para o DataSetProvider, e o DataSetProvider para o ClientDataSet, depois trabalhe direto no ClientDataSet, se o select tiver parâmetros, clique com o botão direito do mouse no ClientDataSet e selecione Fetch Params, ele vai copiar todos os parâmetros da Query, então ao invés de setar os parâmetros e abrir a Query vc seta os parâmetros no ClientDataSet e abre por ele!

Att
Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar