Configurar colunas do DbGrid
Boa tarde a todos,
Eu gostária de saber como posso escolher em tempo de execução as colunas de um dbgrid que eu quero que apareça, e salvar essa configuração no meu usuário.
Tipo mostrar as colunas em listbox e escolher somente as que eu quero visualizar.
Obrigado,
Eu gostária de saber como posso escolher em tempo de execução as colunas de um dbgrid que eu quero que apareça, e salvar essa configuração no meu usuário.
Tipo mostrar as colunas em listbox e escolher somente as que eu quero visualizar.
Obrigado,
Edsant
Curtidas 0
Respostas
Joaoshi
21/02/2008
Colega, parte da resposta:
DbGrid.Columns.Items[1].Visible := false;
Espero ter ajudado.
DbGrid.Columns.Items[1].Visible := false;
Espero ter ajudado.
GOSTEI 0
Paulo_amorim
21/02/2008
Olá
Como mostrou o joaoshi, esse código exibe ou não as colunas.
Mas vai além: a partir do Columns, vc pode carregar o ListBox, exibir e salvar os dados. Para esse caso, vc poderia ter 2 listbox, um com as colunas disponíveis e outra com as colunas visíveis.
Se o que vc quer é configurar o perfil de usuário, seria desejável vc ter essa configuração em bando de dados. É o caso? Se sim, vc pode usar o ListBox de colunas visíveis para carregar sua query de INSERT.
Espero que ajude.
Até+
Como mostrou o joaoshi, esse código exibe ou não as colunas.
Mas vai além: a partir do Columns, vc pode carregar o ListBox, exibir e salvar os dados. Para esse caso, vc poderia ter 2 listbox, um com as colunas disponíveis e outra com as colunas visíveis.
Se o que vc quer é configurar o perfil de usuário, seria desejável vc ter essa configuração em bando de dados. É o caso? Se sim, vc pode usar o ListBox de colunas visíveis para carregar sua query de INSERT.
Espero que ajude.
Até+
GOSTEI 0
Edsant
21/02/2008
Como faço pra carregar o listbox com as colunas da DBgrid?
Obrigado
Obrigado
GOSTEI 0
Edsant
21/02/2008
Ola amigo,
Já consegui elaborar o código:
var
I: Integer;
begin
for I := 0 to DBGrid1.FieldCount - 1 do
ListBox1.Items.Add( DbGrid1.Columns.Items[I].FieldName);
depois coloquei o codigo do amigo na listbox
var
I : integer;
begin
I:= ListBox1.ItemIndex;
DbGrid1.Columns.Items[I].Visible := false;
agora só falta salvar essa configuração no perfil do usuário...
qual a melhor maneira de fazer isso?
se alguem precisar de alguma coisa estamos ai....
Obrigado...
Já consegui elaborar o código:
var
I: Integer;
begin
for I := 0 to DBGrid1.FieldCount - 1 do
ListBox1.Items.Add( DbGrid1.Columns.Items[I].FieldName);
depois coloquei o codigo do amigo na listbox
var
I : integer;
begin
I:= ListBox1.ItemIndex;
DbGrid1.Columns.Items[I].Visible := false;
agora só falta salvar essa configuração no perfil do usuário...
qual a melhor maneira de fazer isso?
se alguem precisar de alguma coisa estamos ai....
Obrigado...
GOSTEI 0
Paulo_amorim
21/02/2008
Olá
Se vc está usando banco de dados, pode utilizá-lo.
Se não, acho que a melhor forma é guardar as configurações em arquivo.
Nesse caso, o arquivo é carregado no momento da autenticação e vc pode rodar uma procedure parecida com essa sua pras colunas que ele já desabilitou/habilitou.
Espero que ajude
Até+
Se vc está usando banco de dados, pode utilizá-lo.
Se não, acho que a melhor forma é guardar as configurações em arquivo.
Nesse caso, o arquivo é carregado no momento da autenticação e vc pode rodar uma procedure parecida com essa sua pras colunas que ele já desabilitou/habilitou.
Espero que ajude
Até+
GOSTEI 0
Edsant
21/02/2008
coloquei esse codigo pra trazer as colunas da grid, mas ela esta trazendo em order alfabetica não na ordem do index vc sabe pq?
var
I: Integer;
begin
for I := 0 to DBGrid1.FieldCount - 1 do
ListBox1.Items.Add( DbGrid1.Columns.Items[I].FieldName);
var
I: Integer;
begin
for I := 0 to DBGrid1.FieldCount - 1 do
ListBox1.Items.Add( DbGrid1.Columns.Items[I].FieldName);
GOSTEI 0
Paulo_amorim
21/02/2008
Olá
Realmente eu não sei, e eu to sem o Delphi aqui pra fazer o teste...
O DBGrid mesmo tá em ordem alfabética na tela?
Se não, dá uma debugada pra ver se é ele quem envia os dados em ordem alfabética ou é o TStrings q tá fazendoisso...
Dei uma pesquisada sobre isso, mas por enquanto não achei algo parecido.
Até+
Realmente eu não sei, e eu to sem o Delphi aqui pra fazer o teste...
O DBGrid mesmo tá em ordem alfabética na tela?
Se não, dá uma debugada pra ver se é ele quem envia os dados em ordem alfabética ou é o TStrings q tá fazendoisso...
Dei uma pesquisada sobre isso, mas por enquanto não achei algo parecido.
Até+
GOSTEI 0
Edsant
21/02/2008
Coloquei a propriedade sorted do listbox para false e resolveu esse problema.
então ficou assim:
//Carrega as colunas da grid
procedure TFColunas.FormActivate(Sender: TObject);
var
I: Integer;
Nome : TForm;
begin
Nome := FAutores;
SrcList.Clear;
for I := 0 to FAutores.DBGrid1.FieldCount - 1 do
SrcList.Items.Add(FAutores.DBGrid1.Columns.Items[I].Title.Caption);
SrcList.CheckAll;
end;
//Deixa invisivel as desmarcadas e visivel as marcadas
procedure TFColunas.OKBtnClick(Sender: TObject);
var
I : integer;
begin
for I := 0 to srcList.Items.Count - 1 do
begin
if not srcList.Checked[I] then
FAutores.DbGrid1.Columns.Items[I].Visible := false
else
FAutores.DbGrid1.Columns.Items[I].Visible := True;
end;
end;
Só mais uma coisa, pra finalizar: O nome do meu formulario que esta a dbgrid é FAutores... mas eu tenho outros formularios que tb vou fazer esse esquema das colunas. Para não criar um formColuna para cada cadastro eu queria carregar o nome do form ativo para uma variavel tipo:
[b:d972cd85d3]NomedoFormulario[/b:d972cd85d3].DBGrid1.Columns.Items[I].Title.Caption
Que tipo de variavel eu crio?
tentei uma String, mas dá erro.
Agredeço a compreenção e a paciencia de todos..
então ficou assim:
//Carrega as colunas da grid
procedure TFColunas.FormActivate(Sender: TObject);
var
I: Integer;
Nome : TForm;
begin
Nome := FAutores;
SrcList.Clear;
for I := 0 to FAutores.DBGrid1.FieldCount - 1 do
SrcList.Items.Add(FAutores.DBGrid1.Columns.Items[I].Title.Caption);
SrcList.CheckAll;
end;
//Deixa invisivel as desmarcadas e visivel as marcadas
procedure TFColunas.OKBtnClick(Sender: TObject);
var
I : integer;
begin
for I := 0 to srcList.Items.Count - 1 do
begin
if not srcList.Checked[I] then
FAutores.DbGrid1.Columns.Items[I].Visible := false
else
FAutores.DbGrid1.Columns.Items[I].Visible := True;
end;
end;
Só mais uma coisa, pra finalizar: O nome do meu formulario que esta a dbgrid é FAutores... mas eu tenho outros formularios que tb vou fazer esse esquema das colunas. Para não criar um formColuna para cada cadastro eu queria carregar o nome do form ativo para uma variavel tipo:
[b:d972cd85d3]NomedoFormulario[/b:d972cd85d3].DBGrid1.Columns.Items[I].Title.Caption
Que tipo de variavel eu crio?
tentei uma String, mas dá erro.
Agredeço a compreenção e a paciencia de todos..
GOSTEI 0
Paulo_amorim
21/02/2008
Olá
O ideal é usar uma função genérica. Nesse caso, vc pode passra o form em si
E na chamada ficaria apenas
Não tinha visto a resposta, desculpe a demora.
Espero que ajude.
Até+
O ideal é usar uma função genérica. Nesse caso, vc pode passra o form em si
procedure PreencheDBGrid( Sender: TForm) var ... begin ... end;
E na chamada ficaria apenas
procedure TFColunas.FormActivate(Sender: TObject) begin PreencheDBGrid(Self); end;
Não tinha visto a resposta, desculpe a demora.
Espero que ajude.
Até+
GOSTEI 0