Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   DBGRID ¿como seleccionar fila y obtener datos de la fila ? (https://www.clubdelphi.com/foros/showthread.php?t=69944)

JXJ 21-09-2010 01:32:25

DBGRID ¿como seleccionar fila y obtener datos de la fila ?
 
¿como seleccionar fila y obtener datos de la fila dbgrid ?

tengo una tabla que tiene los datos

empresa
rfc
domicionio
email
sitioweb

y los muestro en un dbgris con un query selec * from empresa
para mostras todas las empresas listadas y sus datos

ahora lo que quiero es que
al seleccionar una celda de se seleccione automaticamente la fila completa
y obtener los datos de esa fila. para pasarlos a unos edits.

¿como se puede hacer eso?

le he estado viendo si hay algun codigo para seleccionar la fila completa segun la celda selecionada y no lo logro
he probado,, como saber los datos de la fila segun la celda seleccionada y tampo encuentro como hacerlo..

ayuda.. de favor..

gracias.

roman 21-09-2010 01:48:58

En las opciones del DBGrid puedes poner dgRowSelect en true para que se selecciones toda la fila. Y lo de pasar a los Edit, ¿por qué no mejor usas DBEdit para que automáticamente muestre los datos del registro seleccionado?

// Saludos

JXJ 21-09-2010 06:35:12

hace como 1 año recuerdo que en este foro habia el codigo fuente para esas cosas
lo busco y no lo encuentro..
necesito que sean edits. o variables string o integer.
para poder hacer modificaciones a otros controles segun
se requiera

ecfisa 21-09-2010 07:45:21

Hola JXJ.

Me resultó interesante hacerlo, aunque dudo de su utilidad...

Lo que hice fué pasar las columnas del DBGrid a tantos edits como tenga la misma, cuando se hace un click sobre una celda.
Con pocas modificaciónes y del mismo modo; podrías pasar las columnas a TStrings, no tán vistoso, pero más simple y efectivo
si sólo buscas pasar los valores a variables.

Pero bueno, fijate si te sirve o al menos te dá una idea de como hacerlo:
Código Delphi [-]
...
type
  TForm1 = class(TForm)
    IBDatabase1: TIBDatabase;
    IBTransaction1: TIBTransaction;
    IBDataSet1: TIBDataSet;
    DataSource1: TDataSource;
    DBGrid1: TDBGrid;
    procedure FormCreate(Sender: TObject);
    procedure DBGrid1CellClick(Column: TColumn);
  private
  public
  end;

var
  Form1: TForm1;

implementation {$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
var
  i,c: Integer;
begin
  IBDataSet1.Open;   
  c:= DBGrid1.Top + DBGrid1.Height + 8;    // Posición del 1er Edit
  for i:= 0 to DBGrid1.Columns.Count -1 do // Tantos Edits como columnas mostradas
  begin
   with TEdit.Create(Self) do        // Crear Edits
   begin
     Name:= 'Edit'+IntToStr(i);      // Edit1, Edit2,... EditN
     Text:= '';
     Left:= 8;
     Top:=  c;
     Parent:= Self;                  // Mostrarlo
     Inc(c,30);                      // Supongo Heigth 25
   end;
  end;
end;

procedure TForm1.DBGrid1CellClick(Column: TColumn);
var
  i: Integer;
begin
  for i:= 0 to DBGrid1.Columns.Count -1 do
   with TEdit(FindComponent('Edit'+IntToStr(i))) do
   begin
     Text:= DBGrid1.Columns[i].Field.AsString; // Poner dato en Edit
     Width:= Canvas.TextWidth(DBGrid1.Columns[i].Field.AsString+'0'); // Ajustar ancho Edit 
   end;
end;

Nota: No tiene en cuenta el Height del Form respecto a la cantidad de campos, es decir que si tenés 50 campos, vas a tener que modificar algo, o comprar un monitor mas alto... :D


Saludos. :)

rrf 21-09-2010 20:49:09

A ver si esto te sirve...

Utilizo los IBX con Delphi 7 y he hecho algo parecido a lo que tú comentas.

En el evento AfterScroll del IBDataset (seguramente existe ese mismo evento en otro tipo de Dataset), pones una condición if..then que se cumplirá cuando estés en el form que tiene ese DBGrid.

Dentro de ese if..then pones la asignación del contenido de cada campo al edit que le corresponda.

Sería algo así:

Código Delphi [-]
procedure TDModule.DataSet_AfterScroll(DataSet: TDataSet);
begin

  if Ante_el_DBGrid   // variable boolean que indica que está ante el DBGrid
  then
    begin
      Form_con_DBGrid.Edit1.text := DataSet_Campo1.asstring ;
      Form_con_DBGrid.Edit2.text := inttostr(DataSet_Campo2.asinteger) ;
      // ...
      // Etc, etc...
    end ;        

end;

Así, cada vez que hagas clic en el DBGrid o te muevas por él con las teclas de flecha, se pone en marcha este evento y se actualizan los Edit con el contenido de los campos.

Espero que te sirva.

Yhimy_1 18-04-2017 03:50:14

Repuesta !
 
Yo lo he trabajado así , y funciona correctamente ! espero que le sea de ayuda .


Código:


procedure TForm1.dbgrd1CellClick(Column: TColumn);
begin
    if cbbOpciones.ItemIndex =1 then
    begin
        txtNombre.Text      :=  Column.Field.DataSet.Fields[1].Value;
        txtCompanyName.text :=  Column.Field.DataSet.Fields[2].Value;
        txtCompanyId.Text  :=  Column.Field.DataSet.Fields[3].Value;
        txtCountry.Text    :=  Column.Field.DataSet.Fields[4].Value;

    end
    else if  cbbOpciones.ItemIndex =2 then
    begin
          txtCompanyId.Text  :=  Column.Field.DataSet.Fields[3].Value;
    end;


end;



La franja horaria es GMT +2. Ahora son las 15:23:57.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi