viernes, 22 de julio de 2011

Lookup se cambia a Nulo en un DialogWorkspace

En 7.5.3 me vi en una situación donde por código hay que crear un registro en una tabla al presionar un botón, pero hay que seleccionar un valor de una Lookup para crear el registro.

Se decidió crear la funcionalidad en un SmartPart ubicado en el DialogWorkspace, y además que se pudieran establecer condiciones en tiempo real para el filtrado.  Se agregaron 3 checkbox para establecer las condiciones del filtrado por lo que obviamente hay que setear los 3 checkboxes para autopostback, pero al probar la funcionalidad tanto de los 3 checks como del mismo Lookup, el valor devuelto por el Lookup siempre se cambia a nulo luego del postback.

Primero hay que estar seguro que el "Entity" tenga bien mapeado el campo de visualización.  Luego hay que asegurarse que el Lookup esté seteado para binding tipo "String" y no "Object".  Con esto el valor se mantiene pero al traer un elemento del Lookup lo que vendrá es el SLXId del registro.

Agregamos un campo TextBox en el formulario que llamaremos lkID y le ponemos visible = false.  También agregamos un handle al evento LookupResultValueChanged y dentro del procedimiento le asignamos el valor del Lookup así:  this.lkID.Text = this.MyLookup.LookupResultValue.ToString();

Luego agregamos un evento Pre_Render al formulario si no lo tiene ya, y colocamos:

     if (lkID.Text+"$" != "$")
      {
          Sage.Entity.Interfaces.IAccount swssel = Sage.Platform.EntityFactory.GetById<Sage.Entity.Interfaces.IAccount(lkID.Text);
this.MyLookup.Text = swssel.Account;
      }


Oviamente suponiendo que estabamos haciendo un Lookup sobre la entity IAccount.

De esta manera ya tendríamos el SLXId seleccionado en el campo lkID y el texto en la propiedad Text del mismo Lookup.

Luego complemento con lo de los filtros al Lookup en tiempo real porque me han preguntado muchas veces sobre el tema.