Nuevo Combo enlazado a Datos

El problema de los Combos o DropDownList enlazados entre si, siempre fue un problema para mi. Hablo del típico caso en el que es necesario supeditar el contenido de un combo al valor de otro. Un ejemplo clásico de este problema es cuando queríamos ingresar una ubicación geográfica y presentábamos los combos de País, Provincia y Ciudad. Mantener estos tres controles actualizados implicaba un ida y vuelta al servidor que producía una perdida de tiempo y recursos muy importante.
Para solucionar este problema es que desarrolle este control, el cual puede mantener esta coordinación sin mayores sobresaltos.

Este control es básicamente un DropDownList que implementa la interface IScriptControl por lo tanto necesita de un ScriptManager presente en la página.
Se ha extendido su funcionalidad para que pueda acceder al servidor a través del ProveedorDatosServidor, solo en el momento que necesite refrescarse y de manera asincrónica.

Vamos directamente a un ejemplo donde los valores de nuestro control quedan supeditados al registro que estamos editando.
Para hacer esta prueba, usé el ejemplo que aparece aquí, y le agregué un ProveedorDatosServidor apuntando a la tabla Employees. También agregué una fila a nuestro formulario para poder editar el campo “ReportsTo” de la misma tabla.
No voy a mostrar todo el ejemplo nuevamente, solo voy a poner lo que deberíamos agregar para que nuestro nuevo control quede funcionando.

 <MM2:ProveedorDatosServidor ID="Employees2" runat="server" WebMethod="ManejoEmployees">
        <Ordenes>
        </Ordenes>
 </MM2:ProveedorDatosServidor>

Aquí agrego el ProveedorDatosServidor que, como tiene la propiedad WebMethod igual al ProveedorDatosServidor del ejemplo anterior, es capaz de compartir los datos con este. Esto nos da la ventaja tal que, si uno de los dos va a consultar o actualizar al servidor, el otro queda automáticamente actualizado.

<tr>
  <td>
     Reporta a :
  </td>
  <td>
     <MM2:Combo ID="Empleado_AlMo_ReportsTo" runat="server" IdDatos ="Employees2" Descripcion ="LastName" Valor ="EmployeeID" Poblando ="PoblandoReports" Lleno ="false" ></MM2:Combo>
     <MM2:Combo ID="Empleado_BaCo_ReportsTo" runat="server" IdDatos ="Employees2" Descripcion ="LastName" Valor ="EmployeeID" Poblando ="PoblandoReports" Lleno ="false" Enabled="false" ></MM2:Combo>

  </td>
</tr>

Aquí agrego un fila al formulario antes de la fila “Notas” que contiene dos instancias de nuestro control. Una para las altas y modificaciones, y otra (desactivada) para las bajas y consultas .

Paso a describir las propiedades:

Propiedad Tipo Descripción Defecto
IdDatos String Id del ProveedorDatosServidor que provee los datos para el llenado de la lista del control. String.Empty
Descripcion String Nombre de la columna en la tabla que queremos mostrar como elementos de la lista del control. String.Empty
Valor String Nombre de la columna en la tabla que queremos devolver como valor del control. String.Empty
Poblando String Nombre de función en Javascript que se ejecutará cada vez que se agregue un elemento a la lista del control. String.Empty
Lleno Boolean Indica si la lista del control se llenará automáticamente o quedará a la espera de la ejecución del método Refrescar(). true
Validando String Nombre de la función en Javascript que será ejecutada al momento de validar. String.Empty
MensajeError String Texto que se presentará como tooltip cuando el valor no sea válido. Fecha erronea
CssError String Estilo con el cual se presentará el control cuando el valor no sea válido. Erroneo

Por último, les paso las dos funciones en Javascript para que todo esto quede coordinado.


function Mostrado(sender, e) {
  document.getElementById("Empleado_AlMo_ReportsTo").control.Refrescar()
}

function PoblandoReports(sender, e) {
  var Empl = $find("Employees$Formulario").Registro
  if (Empl["EmployeeID"] == e.Valor["EmployeeID"]) {
     e.Cancelar = true
  } 
}

La función Mostrando() es ejecutada cada vez que se invoca el método Mostrar() del formulario. O sea, en nuestro ejemplo, cada vez que presionamos los botones de Agregar, Modificar, Eliminar o Consultar.
Mostrando(), toma nuestro combo y ejecuta el método Refrescar(), lo que obliga a nuestro control a limpiarse y volver a poblar su lista.
Esto disparará el evento Poblando por cada elemento, y como este evento está asociado a la función PolandoReports(), esta ultima será ejecutada tantas veces como elementos haya en la lista. Ahora, por cada uno de ellos, se compara el valor EmployeeID del registro que se esta mostrando en el formulario, con el mismo campo del registro que se esta queriendo agregar a la lista. Si estos son iguales… cancelamos el evento, lo que hace que este elemento quede fuera de la lista. Logrando de esta forma que un empleado no pueda ser jefe de si mismo.

¡¡ Es mas difícil explicarlo que hacerlo !!!

Como siempre aquí está la Librería MoniMisi2 para que se bajen con este control y todo lo desarrollado hasta ahora.

Anuncios

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s