Fórum deletar linhas selecionadas no CXGrid #365999
10/11/2008
0
Estou desenvolvendo um sistema onde tenho uma tela onde uso o componente da DevExpress (CXGrid), faço a seleção das linhas pra excluir, mais parei no seguinte código.
begin
cxGrid1DBTableView1.DataController.DataSet.First;
while not cxGrid1DBTableView1.DataController.DataSet.Eof do
begin
if cxGrid1DBTableView1.DataController.SelectRows then begin
ShowMessage(OracleDataSet1.FieldByName(´COD_TIpO_DOC´).AsString);
end;
cxGrid1DBTableView1.DataController.DataSet.Next;
end;
end;
Conto com a ajuda de vcs.
Desde já agradeço.
Fica com Deus
Sayllonn
Curtir tópico
+ 0Post mais votado
11/11/2008
O método SelectRows é usado para selecionar linhas no CxGrid e não para saber as linhas selecionadas. Ele tem dois parâmetros, o primeiro é a linha inicial, o segundo a linha final.
procedure SelectRows(AStartRowIndex, AEndRowIndex: Integer);
Para vc saber as linhas selecionadas, usa-se a função GetSelectedCount.
function GetSelectedCount: Integer;
Exemplo:
var i: integer; ARowIndex: integer; ARowInfo: TcxRowInfo; begin with cxGrid1DBTableView1.DataController do begin for i := 0 to Pred(GetSelectedCount) do begin ARowIndex := GetSelectedRowIndex(i); // retorna o índice da linha selecionada ARowInfo := GetRowInfo(ARowIndex); // retorna informação da linha selecionada DeleteRecord(ARowInfo.RecordIndex); // deleta o registro da linha selecionada end; end; end; // como vc deu um showMessage, demonstro aqui neste exemplo var i: integer; ARowIndex: integer; ARowInfo: TcxRowInfo; begin with cxGrid1DBTableView1.DataController do begin for i := 0 to Pred(GetSelectedCount) do begin ARowIndex := GetSelectedRowIndex(i); // retorna o índice da linha selecionada ARowInfo := GetRowInfo(ARowIndex); // retorna informação da linha selecionada ShowMessage(VarToStr(Values[ARowInfo.RecordIndex, cxGrid1DBTableView1COD_TIpO_DOC.index])); end; end; end;
Tonidavi2004
Gostei + 2
Mais Posts
10/11/2008
Delmar
cxGridDBsuaTableView.Controller.DeleteSelection;
cxGridDBsuaTableView.DataController.DeleteSelection;
cxGridDBsuaTableView.DataController.Controller.DeleteSelection;
O código acima eu não sei se funciona
O código abaixo funciona para cxGrid não DBs
cxGridTVnfServicoItem.DataController.GotoFirst;
while not cxGridTVnfServicoItem.DataController.IsEOF do
cxGridTVnfServicoItem.Controller.DeleteSelection;
if cxGridTVnfServicoItem.DataController.IsEOF then
cxGridTVnfServicoItem.Controller.DeleteSelection;
DeleteSelection deleta todos registros selecionados
Gostei + 0
10/11/2008
Delmar
cxGridTvPedidoItem.OptionsSelection.MultiSelect:=True;
cxGridTvPedidoItem.DataController.SelectAll;
cxGridTvPedidoItem.DataController.DeleteSelection;
cxGridTvPedidoItem.OptionsSelection.MultiSelect:=False;
Mas neste exemplo tb não é uma grade DB
Gostei + 0
11/11/2008
Delmar
Gostei + 0
11/11/2008
Sayllonn
O meu problema está na linha do selectRows, preciso que alselecionar as linhas quando eu for mandar deletar o selectRows vai lendo as linhas selecionadas e deletando linha por linha. Cada linha selecionada e deletada é será gerado um registro numa tabela de auditoria por isso preciso que ao deletar seja lindo a linha pelo selectRows.
begin
cxGrid1DBTableView1.DataController.DataSet.First;
while not cxGrid1DBTableView1.DataController.DataSet.Eof do
begin
if cxGrid1DBTableView1.DataController.SelectRows[I] (O problema ta aqui) then begin
ShowMessage(OracleDataSet1.FieldByName(´COD_TIpO_DOC´).AsString);
end;
cxGrid1DBTableView1.DataController.DataSet.Next;
end;
end;
Gostei + 0
11/11/2008
Delmar
qtdeLinhasSelecionada:=cxGridDBtvPedidoItem.Controller.SelectedRecordCount - 1; // ou quantidade de linhas selecionadas
qtdeLinhasSelecionada:=cxGridDBtvPedidoItem.DataController.GetSelectedCount - 1; // ou quantidade de linhas selecionadas
for linha := 0 to qtdeLinhasSelecionada do
begin
showmessage(´coluna1 ´ + VarToStr(cxGridDBtvPedidoItem.Controller.SelectedRows[linha].Values[0]) + ´ coluna2 ´ + VarToStr(cxGridDBtvPedidoItem.Controller.SelectedRows[linha].Values[1]) );
showmessage(VarToStr(cxGridDBtvPedidoItem.Controller.SelectedRecords[linha].Values[1]));
end;
cxGridPedidoItemTV.Controller.DeleteSelection; //após percorrer as linhas selecionadas tente DeleteSelection para deletar as linhas selecionadas, isto deve deletar tb no dataset e no BD
Gostei + 0
11/11/2008
Delmar
Ou seja, percorre os itens selecionados já de forma otimizada, tem as intruções para pegar os valores de suas colunas, e deleta os registros
var qtdeLinhasSelecionada, linha : integer;
begin
//qtdeLinhasSelecionada:=cxGridDBtvPedidoItem.Controller.SelectedRowCount - 1; //quantidade de linhas selecionadas
qtdeLinhasSelecionada:=cxGridDBtvPedidoItem.Controller.SelectedRecordCount - 1; //quantidade de linhas selecionadas
//qtdeLinhasSelecionada:=cxGridDBtvPedidoItem.DataController.GetSelectedCount - 1; //quantidade de linhas selecionadas
for linha := 0 to qtdeLinhasSelecionada do
begin
showmessage(´coluna1 ´ + VarToStr(cxGridDBtvPedidoItem.Controller.SelectedRows[linha].Values[0]) + ´ coluna2 ´ + VarToStr(cxGridDBtvPedidoItem.Controller.SelectedRows[linha].Values[cxGridDBtvPedidoItemNOMEP.Index]) );
showmessage(VarToStr(cxGridDBtvPedidoItem.Controller.SelectedRecords[linha].Values[cxGridDBtvPedidoItemNOMEP.Index]));
end;
cxGridDBtvPedidoItem.DataController.DeleteSelection;
Gostei + 0
11/11/2008
Delmar
for i:=0 to DBGridLancamentos.SelectedRows.Count-1 do
begin
DBGridLancamentos.DataSource.DataSet.GotoBookmark(pointer(DBGridLancamentos.SelectedRows.Items[i]));
DBGridLancamentos.DataSource.DataSet.Edit;
DBGridLancamentos.DataSource.DataSet.FieldByName(´CONTROLE´).AsString:=acontrole; //recebe o codigocontrole ou codigocobranca
DBGridLancamentos.DataSource.DataSet.Post;
end;
Gostei + 0
11/11/2008
Sayllonn
. Muito obrigado pela força, qualquer dúvida e se eu puder ajudar ajudarei com certeza. Tenham todos uma ótima tarde de Terça-feira.
Fiquem com Deus.
Gostei + 0
11/11/2008
Sayllonn
DeleteRecord(ARowInfo.RecordIndex) ou dataset.delete se eu selecionar tipo [linha,coluna].
Exemplo:
[A,A]
[A,B]
[A,E]
[A,G]
Da erro. Conto com a ajuda dos colegas novamente.
Desde já agradeço.
Fiquem com Deus
Gostei + 0
12/11/2008
Sayllonn
Gostei + 0
12/11/2008
Delmar
procedure TForm1.Button1Click(Sender: TObject); var qtdeLinhasSelecionada, linha : integer; cgr:TcxCustomGridRow; begin //qtdeLinhasSelecionada:=cxGridDBtvPedidoItem.Controller.SelectedRowCount - 1; //quantidade de linhas selecionadas qtdeLinhasSelecionada:=cxGridDBtvPedidoItem.Controller.SelectedRecordCount - 1; //quantidade de linhas selecionadas //qtdeLinhasSelecionada:=cxGridDBtvPedidoItem.DataController.GetSelectedCount - 1; //quantidade de linhas selecionadas for linha := 0 to qtdeLinhasSelecionada do begin //ShowMessage(cxGridDBtvPedidoItem.Controller.SelectedRows[linha].Values[cxGridDBtvPedidoItemPRODUTO.Index]); //cxGridDBtvPedidoItem.DataController.DeleteRecord(cxGridDBtvPedidoItem.Controller.SelectedRows[linha].RecordIndex); cgr:=cxGridDBtvPedidoItem.Controller.SelectedRows[linha]; ShowMessage(cgr.Values[cxGridDBtvPedidoItemPRODUTO.Index]); //cxGridDBtvPedidoItem.DataController.DeleteRecord(cgr.RecordIndex); end; cxGridDBtvPedidoItem.DataController.DeleteSelection; end;
Aqui já trouxe outra forma de trabalhar
Mas o que quero dizer é que o DeleteRecord pra mim não deu pau, mas após abrir a consulta o registro volta, ou seja, no DB não deletou.
Já com o DeleteSelection os registros não voltam mais. Pra mim funciona 100¬.
OBS. eu uso IBO e a instrução de deleção está na Query, na propriedade deleteSQL
Gostei + 0
25/04/2012
Ondulapel Ltda
Quando abro o dataset do cxgrid, ele está em uma ordem e é esta ordem que aparece no cxgrid. Posso selecionar algumas linhas do cxgrid e trabalhar com os valores destas através do seu índice (selectedrows). O problema ocorre quando eu inverto a ordem dos registros no grid e tento trabalhar com os registros selecionados nesta segunda ordem. O aplicativo entende que a ordem permanece a ordem inicial.
Exemplo:
Abro o dataset e a ordem apresentada inicialmente é a seguinte:
Cod_Prod Produto Qtde
11555 CCCC 10
12444 DDDD 20
13777 EEEE 30
14999 BBBB 40
15888 AAAA 50
Se eu clico na título da coluna Produto, p.e., altero a exibição do cxgrid:
Cod_Prod Produto Qtde
15888 AAAA 50
14999 BBBB 40
11555 CCCC 10
12444 DDDD 20
13777 EEEE 30
Se eu selecionar as linhas intercaladas (linhas 1, 3 e 5) nesta segunda ordem (produtos 15888, 11555 e 13777), o sistema entende que as linhas selecionadas são as de quando abri o dataset (produtos 11555, 13777 e 15888). Alguém sabe como resolver o problema??? Agradeço desde já.
Gostei + 0
28/09/2015
Multi Ltda
Encontrei o artigo acima no site de suporte da devexpress. Ele 2 modos de obter as linhas selecionadas e fala sobre a diferença do índice do registro e o índice da linha (que pode ser afetada com a ordenação)
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)