Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   C++ Builder (https://www.clubdelphi.com/foros/forumdisplay.php?f=13)
-   -   Item en dbgrid (https://www.clubdelphi.com/foros/showthread.php?t=75200)

lmpadron 04-08-2011 18:06:53

Item en dbgrid
 
Hola amigos

Pengo un DBGrid con varias columnas en una aplicacion. Tengo algunos valores en la propiedad PickList de algunas columnas. El problema es el siguiente, como puedo asignar uno de esos valores para que salga por defecto. En el caso de las columnas que no tienen PickList como puedo introducurles algun valor a traves del codigo ?

O sea algo similar a lo que hacemos con un Combobox


escojer el valor a mostrar por defecto
Código:

ComboBox1->ItemIndex = 4;
agregar un Item desde una BD
Código:

ComboBox1->Items->Add(ADOQuery1->FieldByName("campo")->AsString)
agregar un Item diractamente
Código:

ComboBox1->Items->Add("cualquier cosa")
Gracias de antemano

ecfisa 04-08-2011 19:44:37

Hola impadron.

Te pongo un ejemplo de como agregar valores a PickList (TStrings) de determinada columna, por código.
Código:

...
 /* Agrega dos valores a la columna 2 */
  DBGrid1->Columns->Items[2]->PickList->Clear();
  DBGrid1->Columns->Items[2]->PickList->Add("Valor 1");
  DBGrid1->Columns->Items[2]->PickList->Add("Valor 2");
  /* Agrega valores 1 a 10 a la columna 0 */
  DBGrid1->Columns->Items[0]->PickList->Clear();
  for(int i=0; i< 10; i++)
  DBGrid1->Columns->Items[0]->PickList->Add(IntToStr(i+1));
...


Saludos.

lmpadron 04-08-2011 20:02:28

muchas gracias ecfisa por tu ayuda en estos tres temas, pero el problema realmente esta en definir uno de estos valores que agregamos para que salga por defecto ya seleccionado, q el usuario no tenga que desplegar la lista y seleccionarlo.
El otro asunto es como poder introducir valores en una celda del dbgrid, o sea escribirle el valor directamente como si fuera un edit
Código:

Edit1->Text = "un texto";

ecfisa 04-08-2011 20:10:24

Hola impadrón.

Cita:

pero el problema realmente esta en definir uno de estos valores que agregamos para que salga por defecto
No contesté esa pregunta por que no conozco propiedad o función en la clase TStrings que permita eso, es decir algo similar a ItemIndex.
(que yo no conozca no quiere decir que no exista o se pueda ;)).

En cuanto a asignar un valor a una celda, no te olvides que el TDBGrid es como una "representación visual" de los datos que existen en un TDataSet, por lo que podrías hacer algo así:
Código:

  DBGrid1->DataSource->DataSet->Edit();
  DBGrid1->SelectedField->Value = "Valor 1";

Pero si das un ejemplo en concreto de lo que queres implementar, quizá podamos encontrar algo más adecuado.

Un saludo.

lmpadron 04-08-2011 20:20:58

Cita:

Empezado por ecfisa (Mensaje 408550)
Hola lmpadrón.


No contesté esa pregunta por que no conozco propiedad o función en la clase TStrings que permita eso, es decir algo similar a ItemIndex.
(que yo no conozca no quiere decir que no exista o se pueda ;)).

(...)

Pero si das un ejemplo en concreto de lo que queres implementar, quizá podamos encontrar algo más adecuado.

Código:

ADOQuery6->SQL->Clear();
        ADOQuery6->SQL->Add("SELECT distribucion FROM distribucion WHERE proceso = '" + id_proceso +"'");
        ADOQuery6->Open();

        while (!ADOQuery6->Eof)
        {
                DBGrid1->Columns->Items[4]->PickList->Add(ADOQuery6->FieldByName("distribucion")->Text);
                ADOQuery6->Next();
        }

Aqui ya tego los valores en el PickList ahora lo que quiciera es ver si puedo poner uno de ellos que ya salga por defecto seleccionado.

Con respecto a lo de asignar un valor a una celda, bueno voy a probar con la idea que me acabas de dara ver que tal resulta.

Saludos y Muchas Gracias

maeyanes 04-08-2011 20:24:52

Hola...

Los TDataSet tienen un evento llamado OnNewRecord, el cual te puede servir para inicializar valores en un registro nuevo. Esto te lo comento por que me imagino que quieres que al insertar un nuevo registro en la rejilla el campo que cuenta con el PickList ya tenga seleccionado un valor.


Saludos...

lmpadron 04-08-2011 20:28:10

Cita:

Empezado por maeyanes (Mensaje 408554)
Hola...

Los TDataSet tienen un evento llamado OnNewRecord, el cual te puede servir para inicializar valores en un registro nuevo. Esto te lo comento por que me imagino que quieres que al insertar un nuevo registro en la rejilla el campo que cuenta con el PickList ya tenga seleccionado un valor.


Saludos...

Exactamente, jejeje esa es la idea, me podrias postear aolgun ejemplo que pueda ser de utilidad

gracias

maeyanes 04-08-2011 20:35:55

Hola...

Pues básicamente la idea es la misma que te mencionó ecfisa, solamente que tienes que hacerlo desde el evento que te comenté:

Código Delphi [-]
// Código en Delphi pero fácilmente traducible a C++
procedure TForm1.DataSetOnNewRecord(DataSet: TDataSet);
begin
  DataSet.FieldByName('CampoX').AsString = 'Valor predeterminado';
end;


Saludos...

lmpadron 04-08-2011 20:42:44

Cita:

Empezado por maeyanes (Mensaje 408556)

Código Delphi [-]

// Código en Delphi pero fácilmente traducible a C++
procedure TForm1.DataSetOnNewRecord(DataSet: TDataSet);
begin
  DataSet.FieldByName('CampoX').AsString = 'Valor predeterminado';
end;

Saludos...

Gracias a ambos por la ayuda.


Creo que la traduccion es algo asi no ?

Código:

void __fastcall TForm2::ADOQuery1NewRecord(TDataSet *DataSet)
{
      ADOQuery1->FieldByName("campo")->AsString = "Valor";
}


ecfisa 04-08-2011 20:51:27

Cita:

Creo que la traduccion es algo asi no ?
Correcto; o con el mismo resultado:
Código:

  DBGrid1->DataSource->DataSet->FieldByName("campo")->AsString = "Valor";
Saludos.

maeyanes 04-08-2011 20:58:24

Hola...

Cita:

Empezado por ecfisa (Mensaje 408560)
Correcto; o con el mismo resultado:
Código:

  DBGrid1->DataSource->DataSet->FieldByName("campo")->AsString = "Valor";
Saludos.

Yo no usaría esa forma dentro de un evento OnNewRecord. Es más, aún de la forma en que lo puse no es del todo "segura". Lo ideal sería algo como:

Código:

void __fastcall TForm2::ADOQuery1NewRecord(TDataSet *DataSet)
{
  DataSet->FieldByName("campo")->AsString = "Valor";
}

Y de esta forma nos aseguramos que el campo que recibe el valor predeterminado pertenece al DataSet que lanza el evento.



Saludos...

ecfisa 04-08-2011 21:39:18

Cita:

Y de esta forma nos aseguramos que el campo que recibe el valor predeterminado pertenece al DataSet que lanza el evento.
Es cierto, de ese modo se evita cualquier posible equivocación.

Saludos.


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

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