miércoles, 20 de julio de 2016

ImageButton error Sys.WebForms.PageRequestManagerServerErrorException

Hola..
Posiblemente al trabajar con ImageButton; se les presente el siguiente error:

Sys.WebForms.PageRequestManagerServerErrorException input string was not in a correct format

La solución que encontré después de buscar durante dias :'( fue agregar lo siguiente despues del tag HTML:

 

viernes, 10 de junio de 2016

Enviar correo con imágenes incrustadas

Hola a todos.
Por si alguna vez les piden que envíen correos con imágenes; acá les comparto una forma de poder realizarlo:

 
Public Sub CorreoNet(ByVal CorreoDestinatario As String, CorreoDestinatarioCopia As String, ByVal CorreoRemitente As String, ByVal Name As String, _
                     ByVal Asunto As String, ByVal Host As String)
        'Mensaje:
        Dim Mensaje = "Hola mundo... cargando imagen: "

        Dim reader = File.ReadAllBytes("D:\Demo\Imagenes\iGrupo.png")
        Dim image1 = New MemoryStream(reader)
        Dim av = AlternateView.CreateAlternateViewFromString(Mensaje, Nothing, System.Net.Mime.MediaTypeNames.Text.Html)

        Dim headerImage = New LinkedResource(image1, System.Net.Mime.MediaTypeNames.Image.Jpeg)
        headerImage.ContentId = "companyLogo"
        headerImage.ContentType = New Mime.ContentType("image/png")
        av.LinkedResources.Add(headerImage)

        'Configuracion Mensaje:
        Dim Correo = New Mail.MailMessage()
        Correo.To.Add(CorreoDestinatario)
        If Not CorreoDestinatarioCopia = "" Then Correo.CC.Add(CorreoDestinatarioCopia)
        Correo.From = New Mail.MailAddress(CorreoRemitente, Name, Encoding.UTF8)
        Correo.Subject = Asunto
        Correo.SubjectEncoding = Encoding.UTF8

        'Correo.Body = Mensaje
        Correo.AlternateViews.Add(av)
        Correo.BodyEncoding = Encoding.UTF8
        Correo.Priority = Mail.MailPriority.High
        Correo.IsBodyHtml = True

        'Configuracion SMTP:
        Dim Servidor = New Mail.SmtpClient
        Servidor.Host = Host

        'Enviar Correo:
        Try
            Servidor.Send(Correo)
        Catch ex As Mail.SmtpException
            Throw ex
        End Try
    End Sub
End Class

Ademas deberás incluir incluir los siguientes "Imports":
Imports System.Net
Imports System.Text
Imports System.IO
Imports System.Net.Mail
Saludos.

martes, 22 de marzo de 2016

GroupBy usando expresiones lambda

A continuación, voy a mostrarles como utilizar GroupBy con expresiones lambda. Para estos ejemplos se utilizará la siguiente lista:

Dim lista As New List(Of Object)
lista.Add(New With {.ANIO = 2014, .NUMERO = "1521", .SUELDO = 10})
lista.Add(New With {.ANIO = 2015, .NUMERO = "1521", .SUELDO = 20})
lista.Add(New With {.ANIO = 2015, .NUMERO = "1522", .SUELDO = 5})
lista.Add(New With {.ANIO = 2015, .NUMERO = "1522", .SUELDO = 5})

Caso 1: Agrupación por solo un campo + operador adicional
en el siguiente ejemplo se obtiene la suma de "Sueldos" por año.

Dim p1 = lista.GroupBy(Function(g) g.ANIO).Select(Function(a) New With {.numero = a.Key,
                                                                                    .sum = a.Sum(Function(p) p.SUELDO)}).ToList

Caso 2: Agrupación por varios campos + operador adicional
en el siguiente ejemplo se obtiene la suma de "Sueldos" por año y número.

Dim p2 = lista.GroupBy(Function(g) New With {Key g.ANIO, Key g.NUMERO}). _
                        Select(Function(a) New With {.anio = a.Key.ANIO,
                                                     .num = a.Key.NUMERO,
                                                     .sum = a.ToList.Sum(Function(p) p.SUELDO)}).ToList

Caso 3: Uso de GroupBy como reemplazo del Distinct
el siguiente ejemplo aplica el distinct sobre el campo: "ANIO":

Dim p3 = lista.GroupBy(Function(g) g.ANIO).Select(Function(a) a.First).ToList

en caso se tenga se tenga que aplicar varios campos se utilizará lo siguiente:

Dim p4 = lista.GroupBy(Function(g) g.ANIO And g.NUMERO).Select(Function(a) a.First).ToList

Saludos

miércoles, 11 de noviembre de 2015

Mensaje de confirmación

colocar lo siguiente en las propiedades del Button:

OnClientClick="javascript: return confirm('¿Esta seguro de eliminar la programación?');"

Saludos

Descomprimir ZIP

para que el código funcione, es necesario incluir referencia de Ionic.Zip.dll (puedes descargarla de aqui)

copiar el siguiente código:

 
Dim ZipAExtraer As String = ".../carpetaZip/compri.zip"
Dim DirectorioExtraccion As String = ".../CarpetaDatos/"
Using zip1 As ZipFile = ZipFile.Read(ZipAExtraer)
  Dim e As ZipEntry
  For Each e In zip1
    e.Extract(DirectorioExtraccion, ExtractExistingFileAction.OverwriteSilently)
  Next
End Using
Saludos

martes, 10 de noviembre de 2015

Ordenar GridView por Columna

La siguiente solución esta planteada para ordenar los datos de un GridView cuyo DataSource es cualquier lista de objetos o un DataTable, para lo cual utilizaremos un poco de Reflection. xD

Agregar método genérico:
 
Public Sub OrdenarGrilla(Of T)(grid As GridView, lista As List(Of T), campo As String, asc As Boolean)
   If Not String.IsNullOrWhiteSpace(campo) Then
       If asc Then
           lista = lista.OrderBy(Function(l) l.GetType().GetProperty(campo).GetValue(l, Nothing)).ToList()
       Else
           lista = lista.OrderByDescending(Function(l) l.GetType().GetProperty(campo).GetValue(l, Nothing)).ToList()
       End If
   End If
   grid.DataSource = lista
   grid.DataBind()
End Sub

este método puede ser utilizado en caso se tenga un DataTable y no una lista de objetos (por falta de tiempo lo dejo en C#).
 
public void OrdenarGrillaDt( GridView gv, DataTable dt, string campo, bool asc)
        {
            DataView dv = new DataView(dt);
            if (!string.IsNullOrWhiteSpace(campo))
            {
                string sortExp = campo + (asc == true ? " Asc" : " Desc");
                dv.Sort = sortExp;
            }
            dt = dv.ToTable();
            gv.DataSource = dt;
            gv.DataBind();
        }

El cual deberá utilizarse desde el evento Sorting del GridView. Ejemplo:
 
Protected Sub gvDocumentos_Sorting(sender As Object, e As System.Web.UI.WebControls.GridViewSortEventArgs) Handles gvDocumentos.Sorting
    OrdenAsc1 = Not OrdenAsc1
    OrdenarGrilla(DirectCast(sender, GridView), listaDocumentos(), e.SortExpression, OrdenAsc1)
End Sub

Donde:
la variable OrdenAsc1 debe ser un ViewState("_OrdenAsc1_") que almacene el valor orden ascendente (true o false).ejemplo:
     Public Property OrdenAsc1() As Boolean
        Get
            If IsNothing(ViewState("_OrdenAsc1_")) Then
                Return True
            End If
            Return ViewState("_OrdenAsc1_")
        End Get
        Set(ByVal value As Boolean)
            ViewState.Add("_OrdenAsc1_", value)
        End Set
    End Property

Nota
El GridView debe de tener las propiedades AllowSorting="true" y SortExpression="colocar lo mismo que se coloca en la propiedad DataField". Ejemplo:
 

    
         
         
    
 

Saludos.

Left Join usando expresiones lambda

A continuación voy a mostrarles como realizar un left join entre 2 listas de objetos (A y B) utilizando expresiones lambda.

Caso 1
Si lo que se quiere es obtener una lista con objetos de A que no se encuentren en B, se debe copiar lo siguiente:


 
Dim lista = listaA.SelectMany(Function(a) listaB.Where(Function(b) b.Codigo = a.Codigo).DefaultIfEmpty().Where(Function(w) IsNothing(w)), Function(a, b) New ObjetoBE With {.Codigo = a.Codigo, .Descripcion = a.Descripcion}).ToList()

Caso 2
Si lo que se quiere es obtener la lista de objetos A, pero diferenciando a los objetos que también están en la lista B. Se debe copiar lo siguiente: 

 
Dim lista = listaA.SelectMany(Function(a) listaB.Where(Function(b) b.Codigo = a.Codigo).DefaultIfEmpty() , Function(a, b) New ObjetoBE With { .Codigo = a.Codigo, .Indicador = If(IsNothing(b),0,1) }).ToList()

Saludos.