sábado, 30 de junio de 2012

jQuery con Grids y Checkboxes

El siguiente ejemplo muestra como hacer grupos de selección dentro de un gridview.

Para esto creo una clase que representara los items del grid (esto lo dejo a consideración de cada quien, también puede llenarse con Datatables y/o otras fuentes de datos.

public class ItemGrid
{
    public int Id { get; set; }
    public string Nombre { get; set; }
    public int GroupKey { get; set; }
}

El CodeBehind de la pagina será el siguiente:

public partial class Default : System.Web.UI.Page
{

    #region [Eventos]
    protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {
            cargaGrid();
        }
    }

    #region [Grid]
    protected void cargaGrid(){
        gvServicios.DataSource = GeneraRegistros();
        gvServicios.DataBind();
    }
    #endregion

    #endregion

    #region [Getters]
    public List<ItemGrid> GeneraRegistros()
    {
        List<ItemGrid> listado = new List<ItemGrid>();
        listado.Add(new ItemGrid() { Id = 1, Nombre = "Servicio 1", GroupKey = 1 });
        listado.Add(new ItemGrid() { Id = 2, Nombre = "Otro Servicio", GroupKey = 1 });
        listado.Add(new ItemGrid() { Id = 3, Nombre = "N servicio", GroupKey = 2 });
        listado.Add(new ItemGrid() { Id = 4, Nombre = "R Servicio", GroupKey = 3 });
        listado.Add(new ItemGrid() { Id = 5, Nombre = "segundo de N", GroupKey = 2 });
        listado.Add(new ItemGrid() { Id = 6, Nombre = "tercero de N", GroupKey = 2 });
        listado.Add(new ItemGrid() { Id = 7, Nombre = "R segundo", GroupKey = 3 });
        listado.Add(new ItemGrid() { Id = 8, Nombre = "R tercero", GroupKey = 3 });
        listado.Add(new ItemGrid() { Id = 9, Nombre = "muchos servicios", GroupKey = 1 });
        listado.Add(new ItemGrid() { Id = 10, Nombre = "Decimo Servicio", GroupKey = 1 });

        listado.Add(new ItemGrid() { Id = 11, Nombre = "Decimo Servicio", GroupKey = 1 });
        listado.Add(new ItemGrid() { Id = 12, Nombre = "Otro para el uno", GroupKey = 1 });
        listado.Add(new ItemGrid() { Id = 13, Nombre = "ya son muchos", GroupKey = 2 });
        listado.Add(new ItemGrid() { Id = 14, Nombre = "este es del 2 grupo", GroupKey = 2 });
        listado.Add(new ItemGrid() { Id = 15, Nombre = "Este es el ultimo", GroupKey = 1 });

        return listado;
    }
        
    #endregion
}

 

Ahora veamos el html y scripts

Primero el body:

<asp:GridView ID="gvServicios" runat="server" AutoGenerateColumns="False">
            <Columns>
                <asp:BoundField DataField="Id" HeaderText="Identificador" />
                <asp:BoundField DataField="Nombre" HeaderText="Servicio" />
                <asp:TemplateField HeaderText="Grupo">
                    <ItemTemplate>
                        <asp:Label ID="lblGroupKey" runat="server" Text='<%# Eval("GroupKey") %>'></asp:Label>
                        <asp:HiddenField ID="IDVal" runat="server" Value='<%# Eval("GroupKey") %>' />
                    </ItemTemplate>
                </asp:TemplateField>
                <asp:TemplateField>
                    <ItemTemplate>
                        <asp:CheckBox ID="chkType" runat="server"  onclick='<%# "SingleSelector(this," + Eval("GroupKey") +")" %>' />
                    </ItemTemplate>
                </asp:TemplateField>
            </Columns>
        </asp:GridView>

El valor de GroupKey lo coloco en un hiddenfield, para manipularlo, y en un Label, para que se vea el grupo con el que se trabaja, en otra columna tendremos el check box: chkType, que llama a una función en jscript (SingleSelector) la cual tiene 2 parámetros, el primero es el mismo checkbox que lo llama, y el segundo parámetro es el identificador del grupo.

En el header tendremos la importación de jQuery, así como nuestra función de agrupamiento

<head runat="server">
    <title></title>
    <script src="Scripts/jQuery1.7.2.js" type="text/javascript"></script>
    <script type="text/jscript">
        
        function SingleSelector(chk, group) {
            var count = 0;
            //Recorrer todos los elementos del grid
            $('#gvServicios tr').each(function () {
                //Obtener el id del grupo seleccionado
                var vargrupo = $(this).find("input[id*='IDVal']").val();
                var selec = $(this).find("input[id*='chkType']");

                if (group == vargrupo) {
                    if (chk.name != selec.attr("name")) {
                        selec.attr("disabled", chk.checked == true ? true : false);
                        count++;
                    }
                }
            });
        }
    </script>
</head>

Lo primero que hace esta función es recorrer todos los elementos del grid, luego obtenemos el grupo que tiene ese renglón, y el check asociado a ese grupo. Lo siguiente a realizar es la comparativa del grupo, si son iguales, revisamos que sean diferentes el checkbox que se paso en la función, y el checkbox del renglón en el que nos encontramos, esto es para que el elemento que se esta seleccionado siempre este habilitado. Luego se establece para todos los elementos que no son el seleccionado y que pertenecen al grupo, como deshabilitados, si el checkbox que se paso en la función esta checkado.

Perdón si no es tan clara la redacción, pero a veces es mejor verlo en funcionamiento.

Gridj

Como se puede apreciar en la imagen, solo nos permitirá seleccionar un elemento del grupo a la vez.

 

Espero que les sea de utilidad.

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
}

viernes, 23 de marzo de 2012

Como registrar una dll en windows

Primero que nada es indispensable colocar la dll que se va a utilizar en la carpeta de system, como se ve el path a continuación:

C:\WINDOWS\system

Ahora se abre un prompt de comandos y se escribe lo siguiente:

REGSVR32 MiDLL.dll

Nota: si la dll esta en la carpeta de system, no es necesario especificar la carpeta a la hora de registrarla, en otro caso se debe especificar.


Para quitarla se haría de la siguiente manera:

REGSVR32 /u LaDll.dll

Donde /u significa que debe desinstalarla

miércoles, 4 de enero de 2012

Expresiones regulares

Para validar URLs:
http(s)?://([\w-]+\.)+[\w-]+(/[\w- ./?%&=]*)?
Para validar correo:
^([\w-\.]+)@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.)|(([\w-]+\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\]?)$
Para validar cadenas sin caracteres especiales:
^[a-zA-Z0-9ñÑáéíóúÁÉÍÓÚ]+$
Para validar RFC
^[a-zA-Z]{3,4}(\d{6})((\D|\d){3})?$

Para usarlo mediante una función seria de la siguiente manera:

Function IsValidEmail(ByVal strIn As String) As Boolean
Return
Regex.IsMatch(strIn,
("^([\w-\.]+)@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.)|(([\w-]+\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\]?)$"))
End Function