viernes, 25 de mayo de 2012

jQuery datepicker y asp.net

Pues me puse a investigar como usar el datepicker de jQuery, ya que creo que es mas ligero que el de ajax.

Y en la implementación tenia que deshabilitar la entrada manual al textbox, pero o sorpresa, no se puede usar la opción de readonly, o de enabled del textbox, por que si no no funciona esto, y la solucion, la tenia también jQuery, resumamos el requerimiento

  • Bloquear el textbox
  • Formatear la fecha
  • disparar funcionalidad al seleccionar la fecha
  • Mostrar el datepicker a partir de una imageny aquí esta el código:
$('#txtFInicio').attr('disabled', true);
$('#txtFFinal').attr('disabled', true);
//Agregar datepickers
var imgurl = '<%= ResolveUrl("~/Images/calon.gif") %>';
$('#txtFInicio').datepicker({
showOn: 'button', buttonImageOnly: true, buttonImage: imgurl
, dateFormat: 'yy-mm-dd'
, onSelect: function () {
//Si la fecha final tiene valor, validar la fecha inicial
if ($('#txtFFinal').val() != "") {
if (!validaFechas($('#txtFInicio').val(), $('#txtFFinal').val())) {
alert("La fecha final debe ser mayor a la fecha inicial");
$('#txtFInicio').val("");
}
}
}
});

Para obtener la url de la imagen sin problemas uso la siguiente linea:


var imgurl = '<%= ResolveUrl("~/Images/calon.gif") %>';

El metodo ResolveURL es un metodo de .Net que convierte la url en algo entendible, ya que como recordaran la tilde ~ nos manda a raíz del directorio, pero eso no lo interpreta el html, si no .Net, y esta rutina se encarga de convertirlo en algo que el html pueda interpretar.

Bueno eso es todo lo necesario

Checkboxlist y jQuery II

Bueno en el post pasado, especifique como obtener todos los valores seleccionados. Ahora veamos como ver si un valor en especifico del listado esta seleccionado. cabe mencionar que es importante saber cuantos elementos hay en el listado, para ir a ese índice y validarlo.

var Complementarios = $('#<%=chkOptions.ClientID%> :checkbox')[0].checked ? 0 : 1;


lo que hago es validar el checkbox por su índice, y evalúo si esta seleccionado o no.


Y de pilón agrego como deseleccionar todos los elementos dentro de un checkboxlist. personalícenlo si necesitan hacer lo contrario.


$('#<%=chklist.ClientID%> input:checkbox:checked').each(function () {
$(this).attr('checked', false);
});

Checkboxlist y jQuery I

Primero vamos a ver como se obtienen todos los elementos seleccionados de un checkboxlist. Para eso tenemos el siguiente codigo

function obtenerGuidsServicios() {
var seleccion = "";
$('#<%=chklist.ClientID%> input:checkbox:checked').each(function () {
//seleccion += $(this).parent().text() + ","; //para el texto
if (seleccion.length == 0) {
seleccion = $(this).val();
}
else {
seleccion += "," + $(this).val(); //
}
});
return seleccion;
}

Es importante tener la variable donde se van a arrojar los valores de la selección. en este caso hago una concatenación de esos valores por una coma, pero la idea general es lo importante.

También tengo entre comentarios, como obtener el valor del texto asociado a ese chechbox dentro del listado

Radiobuttonlist desde jQuery

Lo que necesitaba hacer era obtener el índice seleccionado del radiobuttonlist para que dependiendo de eso, realizar mas acciones (sencillo no?).

El chiste era obtener el acceso adecuado a la estructura html del radiobuttonlist.

Bueno aquí esta el código

 //Seleccion del radio buton para filtros
$('#<%=rblopc2.ClientID%> :radio').click(function () {
//casos
switch ($('#<%=rblopc2.ClientID%> input').index(this)) {
case 0:
//Mostrar un div
$('#<%=dvRangos.ClientID%>').show();

//Funcionalidad

break;
case 1:
//
$('#<%=dvServicios.ClientID%>').show();
HideFechas();
break;
case 2:
//Funcionalidad

break;
}
});



Las limitantes que encuentro, es que se deben saber que valores puede tomar el radiobuttonlist, ya que a partir de ahí se realizarían los casos para la funcionalidad

Iterar un Gridview con Linq

Para iterar el gridview debemos obtener la colección de registros de forma que sea IEnumerable

Eso es con el método Cast.

Adicionalmente se obtienen las columnas que se necesiten del grid

var rows = GridView1.Rows.Cast<GridViewRow>().Select(a => new
            {
                ID = Convert.ToInt32(a.Cells[0].Text),
                FirstName = a.Cells[1].Text,
                LastName = a.Cells[2].Text
            }).ToList();

Finalmente se obtiene el listado de esa operación, y se manipula a consideración

miércoles, 23 de mayo de 2012

CRM 2011 Linq (Join) Early Binding

Para realizar un Join de entidades del CRM se deben tener previamente la clase compilada que representa a sus entidades (futuro post como generarla)

Lo primero que se necesita es tener el proxy con la interface IOrganizationService

public IOrganizationService getService()
{
IOrganizationService _serv;
Uri OrgUri = new Uri(string.Format(ConfigurationManager.AppSettings["UrlCrm"].ToString()));
ClientCredentials credentials = new ClientCredentials();
credentials.UserName.UserName = ConfigurationManager.AppSettings["UId"].ToString();
credentials.UserName.Password = ConfigurationManager.AppSettings["PId"].ToString();
OrganizationServiceProxy _srvproxy = new OrganizationServiceProxy(OrgUri, null, credentials, null);
_srvproxy.ServiceConfiguration.CurrentServiceEndpoint.Behaviors.Add(new ProxyTypesBehavior());
_serv = (IOrganizationService)_srvproxy;
return _serv;
}

Este método es indispensable para cualquier comunicación con el CRM.


Ahora bien vamos a acceder al CRM con Linq mediante vinculación temprana, para hacerlo se necesita crear un contexto de ejecucion con la clase

OrganizationServiceContext

Este tiene un metodo llamado CreateQuery. que tiene 2 implementaciones; la primera se le pasa entre paréntesis el nombre de la entidad que se quiere mapear, pero esto es Late Binding, y la otra pasarle el nombre de la clase como genérico con <> Esto es Early Bound

CreateQuery<SystemUser>


Finalmente tenemos la siguiente implementación donde se consultan 2 entidades del CRM, es muy importante que si se usan filtros, se debe poner un WHERE por entidad, ya que si no se hace bolas y confunde los campos de las entidades, aunque están escritos explícitamente.

_srv = getService();
using (OrganizationServiceContext osc = new OrganizationServiceContext(_srv))
{

var Query = (from own in osc.CreateQuery<SystemUser>()

join cli in osc.CreateQuery<Account>()
on own.Field2.Id equals cli.Dield2.Id
where (own.SystemUserId.Value == OwnerId)
where (cli.AccountId.Value == ClienteId)
select new
{
sucursal = own.Field1.Id
});
// Utilizar la variable Query
}