Etiqueta: c#

  • Nuevas ‘versiones’ de Visual Studio 2019

    Pues eso… con fecha de anteayer 2 de marzo, hay nuevas versiones de Visual Studio 2019, tanto para la versión final: v16.9.0 como para la preview: v16.10 Preview 1.0.

    Este es un extracto de las novedades de .NET Productivity de la versión 16.9.0:
    He resaltado las que, a mí me, parecen más interesantes.

    .NET Productivity (versión final v16.9.0)

    • There is now IntelliSense completion for preprocessor symbols.
    • Solution Explorer now displays the new .NET 5.0 Source Generators.
    • Go To All won’t display duplicate results across netcoreapp3.1 and netcoreapp2.0.
    • Quick Info now displays compiler warning IDs or numbers for suppressions.
    • Using directives will now automatically get added when copying and pasting types to a new file.
    • IntelliSense completion will now automatically insert a semicolon as a commit character for object creation and method completion.
    • Semantic colorization for C# 9.0 records.
    • Refactoring that removes unnecessary discards.
    • Refactoring that converts a verbatim and regular string to an interpolated string preserving curly braces that were intended to go in the output.
    • Code fix in Visual Basic that removes the shared keyword when you convert methods that are shared to a module.
    • A refactoring that suggests using new(…) in non-contentious scenarios
    • A code fix that removes redundant equality expressions for both C# and Visual Basic
    • The .NET Code Style (IDE) analyzers can now be enforced on build
    • The Syntax Visualizer shows the current foreground color for enhanced colors
    • A new tooltip when hovering over the diagnostic ID for pragma warnings
    • When you type the return key from within a comment the new line is now automatically commented out
    • Inline parameter name hints enhancements
    • .NET Core Debugging with WSL 2

    Para la versión preview… pues… mejor lo miras en la página de información publicada por la gente de Microsoft.

    Nos vemos.
    Guillermo

  • Acceder a la página maestra (Master page) desde una página en ASP.NET para .NET Framework (con C# y VB)

    Pues eso… el otro día estaba escribiendo código para un nuevo sitio web de un colega (ConservasYoga.com.es) y me decidí a hacerlo en C# , por aquello de que creía que ya no existen plantillas (o eso creo ) en Visual Studio 2019 para ASP.NET con Visual Basic, pero sí existen, de las que no existen es para usar ASP.NET Core.

    La cuestión es que quería acceder a ciertas propiedades (y/o métodos) de la master page y lo hice (o lo intenté) tal como lo hago con Visual Basic, es decir, usando Master.Propiedad, pero nada… daba error… después de muchas pruebas lo conseguí… algo rebuscado, pero… probando, probando… lo pude encontrar, y es que en C# para acceder a las cosas definidas en una página maestra hay que usar el nombre de la página maestra (en minúsculas) seguida de un guón bajo y la palabra master (también en minúsculas), es decir, si la página maestra se llama Site.master para acceder al código desde C# hay que usarlo de esta forma: site_master.

    Un ejemplo de sitio usando Master Page en VB y C#

    Para este ejemplo he optado por seleccionar un sitio en blanco: ASP.NET Empty Web Site (ver figura 1), ya que si se elige el tipo ASP.NET Web Forms Site te añade un montón de código y página, etc., que… en los hosting de ASP.NET que hay por esta zona no funcionan… y si intento que sea de ASP.NET Core ya ni te digo, ninguna de las empresas de hosting con las que he probado (Axarnet, IONOS, acens) lo soportan, incluso una de ellas me dijo que como es código abierto por eso no lo soportan… pero sí venden servidores con Linux, WordPress, PHP… que… ¡lo mismo no son de código abierto! 😉

    En fin…

    Figura 1. Crear un nuevo proyecto de C# (Empty Web Site)

    Cuando trabajo con sitios de ASP.NET no me gusta usar el code behind, si no que prefiero que cada página tenga su código, de esa forma no es necesario compilar la aplicación, si no que se usa el código directamente en el sitio hospedado y ya está… el ASP.NET de IIS se encarga de compilar las páginas y el código a usar. Y lo mejor es que si haces cambios, solo tienes que subir la página o el fichero de código modificado y ya está… ¡a compilarlo tocan! pero… ¡que lo compile otro! 😉

    En el segundo tipo de proyecto todo lo que añade el Visual Studio usa el code behind, mientras que en el proyecto vacío, cuando añadas una nueva página (maestra o normal) puedes indicar que no se incluya el código de forma separada (que es lo que viene a significar el code behind o separación entre el diseño y el código).

    Si elegimos añadir una nueva página con el código incrustado en la propia página tendremos que hacer algo como lo mostrado en la figura 2.

    Figura 2. Añadir nueva página con el código separado de la página aspx

    En ese caso, se indica también seleccionar una página maestra para esa página aspx.

    Y si decidimos que el código esté separado lo haremos como se muestra en la figura 3.

    Figura 3. Nueva página con el código en la propia página.

    Es decir, quitamos la marca de la casilla Place code in separate file.

    Al añadir una página de esa forma tendremos esto en la página:

    <% @ Page Title="" Language="VB" MasterPageFile="~/MasterPage.master" AutoEventWireup="false" 
        CodeFile="Prueba.aspx.vb" Inherits="Prueba" %>
    

    Donde CodeFile indica qué página es la que tiene el código y el Inherits es el nombre de la clase.

    Si esto lo has hecho por error… puedes arreglarlo.
    ¿Cómo?
    Simplemente quitando todo lo que se indica en CodeFile y en Inherits y poniendo el código aparte, tal como te muestro a continuación:

    <% @ Page Title="" Language="C#" MasterPageFile="~/MasterPage.master"  %>
    
    <script runat="server">
    
    </script>
    

    Nota:
    Por cierto, esa página la he añadido al proyecto de C#, pero está usando el código de VB, y es porque yo, por error, he seleccionado una página de Visual Basic (tal como ves en la figura 3).
    Pero en el código mostrado lo he cambiado a C#.

    Decir o aclarar que en un sitio web hecho con ASP.NET para .NET Framework podemos usar tanto código de VB como de C#, aunque no revueltos.

    En este sitio que he creado, en el proyecto de C# uso una página con código de VB y otras dos con el código de C#.

    En la página maestre he definido una propiedad con el título de la aplicación.
    En C# quedaría de esta forma:

    <script runat="server">
    
        public static string AppName { get; set; } = "Web Site Master C#";
    
    </script>
    

    En la de Visual Basic, esa misma propiedad la definimos como te muestro a continuación:

    <script runat="server">
    
        Public Shared Property AppName As String = "Web Site Master VB"
    
    </script>
    

    Como es una propiedad compartida, en C# se utiliza static y en VB se usa Shared.

    Y para usarla desde C# lo haríamos de esta forma, por ejemplo para poner el título de la página 2:

    <asp:Content ID="Content2" ContentPlaceHolderID="ContentPlaceHolder1" Runat="Server">
        <h2>Prueba2 en C# para <%= masterpage_master.AppName  %> </h2>
    </asp:Content>
    

    Como dije al principio, en VB podemos usar Master para acceder al código de la página maestra, en C# no sepuede.
    Lo que también se puede en VB es usar la clase de la página maestra, es decir, tal como se hace en C#.
    Decirte que esto último hará que en VB no te muestre un warning que sí muestra cuando se accede a la página maestra usando Master (ver la figura 4).

    Nota:
    No sé porque ahora me muestra ese warning, ya que siempre lo he usado así (con Master.Propiedad) y nunca había salido esa advertencia, pero bueno… si queremos compatibilidad entre los dos lenguajes, podemos hacerlo usando el nombre de la clase.

    Figura 4. Desde C# no se puede usar Master si no el nombre de la clase de la página maestra

    Resumiendo el acceso a las páginas maestras desde código

    Mejor usar el nombre de la clase, tanto en C# (que es la única forma de ahcerlo, al menos que yo sepa) como en VB.

    Te iba a comentar que, aparte de lo que ya hemos visto, desde un sitio web de asp.net con .NET Framework se puede usar tanto código de VB y de C# en conjunto, solo hay que poner dicho código en carpetas diferentes e indicarlo en el fichero Web.Config.

    Esto ya lo expliqué cuando salió ASP.NET 2.0 y por tanto las páginas maestras.
    Este es el enlace en elguille.info: Usar clases de VB y C# en una misma aplicación Web.

    Pero te lo resumo brevemente.

    Usar código de VB y C# en un mismo sitio de ASP.NET Framework

    Crea la carpeta de código App_Code, decide qué lenguaje será el que use las clases puestas en esa carpeta (normalmente el lenguaje con el que has creado el proyecto), crea una nueva carpeta (dentro de App_Code) para poner las clases del otro lenguaje.

    Por ejemplo, si queremos que en la carpeta App_Code estén las clases de VB y en la carpeta c-sharp (App_Code\c-sharp), pondremos esto en el fichero web.config:

    <compilation debug="true" strict="true" explicit="true" targetFramework="4.7">
        <codeSubDirectories>
            <add directoryName="c-sharp" />
        </codeSubDirectories>
     </compilation>
    

    Este código estará dentro de la rama: <configuration><system.web>.

    Para acceder a las clases o el código se hace de la forma habitual, en este ejemplo, he definido una propiedad estática/compartida para que se pueda acceder desde el código ASP.

    Hay que tener en cuenta que C# distingue entre mayúsculas y minúculas, mientras que a VB le da igual como la escribamos.

    <p>Usando el código definido en la carpeta <b>App_Code</b></p>
    <p>Acceso al código de C# (class1.Nombre):  <% = Class1.Nombre  %> </p>
    <p>Acceso al código de VB (class2.Nombre): <% = Class2.Nombre %> </p>
    <p>En C# hay que usar correctamente el nombre: Class1 y Class2 (no class1/class2 como en VB).</p>

    Y esto es todo… este es el código en GitHub por si le quieres echar un vistazo.

     

     

    Cambios en el código de C# para que compile con C# 5.0

    Al limpiar el proyecto de los «packages» que añade el Visual Studio, empiezan los errores, uno de ellos es que C# 5.0 no permite asignar valores a las auto-propiedades, por tanto, el código mostrado antes hay que sustituirlo por este otro:

    El de la clase Class1.cs: (tanto en el proyecto de VB como en el de C#)

    public static string Nombre 
    { 
        get { return "¡Hola Mundo de C#!"; }
    } 
    

    El de la página maestra:

    <script runat="server">
    
        public static string AppName 
        { 
            get {return "Web Site Master C#"; } 
        }
    
    </script>
    

    El código de VB no hay que modificarlo, se ve que el compilador usado reconoce la autodefinición de propiedades con asignación de valores.

    En el código de GuitHub ya está rectificado.

    Nos vemos.
    Guillermo

  • Quien dice 32, dice 33: gsNotasNET.Android v2.0.0.33

    gsNotasNET.Android v2.0.0.33

    Utilidad para dispositivos móviles Android para tomar notas y guardarlas localmente o en una base de datos externa.

    En esta versión (v2.0.0.33) la utilidad/aplicación hace lo siguiente:

    Permite crear notas y marcarlas con estos atributos/propiedades:

    • Indicar a qué grupo (tag/etiqueta) pertenece.

    • Se pueden crear tantos grupos como se deseen.

    • El programa recordará el último nombre de grupo utilizado al guardar una nota.

    • Se pueden ver los grupos que hay creados, mostrando la información de las notas que contiene.

    • Al mostrar los grupos se muestra la información de las notas que contiene.

    • (v2.0.0.32) Al seleccionar un grupo (clic o tap) te muestra la información de tallada de las notas que contiene, así como la lista de esas notas pertenecientes a ese grupo. Desde esa lista puedes editar las notas.

    Atributos /Propiedades de cada nota:

    • Favorita, al mostrar las notas (de la base de datos externa) las notas favoritas se muestran al principio.

    • Notificar, las notas marcadas para notificar se pueden usar para que al hacer login se muestren automáticamente, ahí puedes anotar los recordatorios que necesites ver cada vez que inicias sesión.

    • Archivada, esto hará que la nota no se muestre al mostrar las notas activas.

    • Eliminada, es otra forma de ocultar las notas, ya que nunca se eliminan físicamente de la base de datos (tanto local como externa).

    • Sincronizada, esta propiedad indica si la nota está sincronizada entre las bases local y externa. Las notas siempre se sincronizan entre las dos bases de datos.

    Para mostrar las notas hay varios apartados en el menú o pantalla principal, pudiendo mostrar las notas según el atributo o propiedad seleccionado.

    • En la lista de notas se muestra la siguiente información:

    • El título de la nota que consiste en los primeros 50 caracteres o si hay cambios de líneas en la nota, la primera línea.

    • El nombre del grupo, la fecha de modificación y una letra cn el nombre del atributo y si está marcado (True) o no lo está (False).

    • Las abreviaturas de los atributos son:

      Favorita, Notificar, Archivada y Eliminada.

    • En una nueva actualización añadiré Sincronizada, aunque se supone que siempre deben estar sincronizadas.

    • Seguramente también añadiré una página (opción) para mostrar las notas sincronizadas y poder asegurarte que si no está sincronizada, lo haga.

    En la configuración puedes indicar:

    • Recordar el usuario con el que se ha hecho Login.
    • Recordar el password usado.
    • Iniciar la aplicación con el último usuario.
    • Mantener las notas sincronizadas (siempre está activada esta opción).
    • Mostrar las notas a Notificar al iniciar el programa (o hacer Login).
    • Usar las notas locales (cuando se activa) o usar las notas de la base externa.

    En la información del Perfil te muestra los datos de la cuenta con la que has hecho Login.

    • Ahí puedes cambiar la cuenta de correo y el password.

    • Si cambias la cuenta de correo, se enviarán 2 mensajes, uno a cada cuenta pidiendo confirmación.

    • Te muestra la inforamción de la fecha de alta, último acceso, cuántas notas de la base externa puedes escribir:

    • Para los primeros 90 usuarios que se registren tienen una cuota de 1.000 notas, a partir del usuario 100 (los otros 10 los tengo reservados para mí) tendrán 100 notas como máximo de forma totalmente gratuita.

    • En esa cantidad, se cuentan todas las notas, estén o no eliminadas (ya que nunca se eliminan las notas).

    • El importe por cada 1.000 notas será de una donación anual de 12$ USD (unos 10€).

    • En esa cuota no se cuentan las notas ofrecidas gratuitamente.

    • El importe indicado en Pagos será el importe que hayas ido pagando.

    • Ya te digo que solamente debes pagar si quieres más cantidad de notas. La aplicación es totalmente gratuita. Salvo que prefieras hacer un donativo voluntario.

    • El donativo lo puedes hacer mediante este enlace: Donativo para elGuille.

    • Todos los donativos serán siempre bienvenidos 🙂

    Puedes realizar búsquedas en las notas (tanto en la base local como en la externa).

    • La búsqueda se realiza sin tener en cuenta el case (no diferencia entre mayúsculas y minúsculas).

    • Por ahora solo hace la búsqueda en el Texto de las notas.

    • En una nueva actualización incluiré que se pueda hacer tanbién (o solo) en los nombres de los grupos).

    • En el resultado de la búsqueda puedes pulsar (hacer clic o tap) en la nota para editarla.

    • Aunque estés usando las notas de la base de datos remota (de SQL Server) puedes mostrar las notas de la base de datos loca, en este caso las notas no son editables, solo se muestran en la lista y haciendo tap o clic en ellas no se muestran. ??? Si quieres editar una nota local, debes cambiarlo en la configuración seleccionando la opción Usar las notas locales.

    En la pantalla principal además te encontrarás con estas opciones:

    • Validar Email. Esto tendrás que usarlo cuando te registres con un nuevo usuario. O al crear un nuevo usuario.

    • Sincronizar. Esta opción te sirve para comprobar si las notas están sincronizadas (deberían estarlo), pero en caso de que no lo estuvieran, puedes sincronizar las locales al romoto o al revés.

    • Comentarios. Por si quieres enviarme alguna sugerencia, bug o cualquier cosa que me quieras decir. Esta opción te permite indicar un comentario y al pulsar en el botón de ENVIAR… abrirá una cuenta de email que tengas configurada en tu dispositivo para poder enviar el mensaje. El texto que hayas escritor aparecerá en el cuerpo del mensaje.

    • Acerca de Abre una ventana con un poco de ayuda sobre la aplicación. Seguramente añadiré un enlace a esta página descriptiva, ya que tanto texto no se puede poner en ese tipo de páginas… o al menos no se vería bien.

    • Cambiar de usuario. Desde ahí puedes hacer login, si no lo has hecho ya, o bien poder registrar un nuevo usuario.

    • Con esta última actualización, tanto en la ventana principal (Menú) como en la de Acerca de se comprueba si hay una nueva versión y de ser así, se indica de ese hecho, De esta forma puedes estar avisado y te puedes descargar el paquete de instalación.

    NOTA: Esta release (recuerda que las releases o paquetes de instalación) siempre son versiones Release no versiones Debug. Y en esta he tenido que hacer 9 comprobaciones en el dispositivo físico ya que me daba error al comprobar si había una nueva versión. En modo debug funcionaba bien, pero en la release daba error. Y todo era por hacer caso a los tips de la documentación de .NET, y es que para esa comprobación uso el ensamblado que se está ejecutando y yo siempre usaba (y seguiré usando, al menos en las versiones para móviles) este código para obtener el ensamblado:

    var ensamblado = System.Reflection.Assembly.GetExecutingAssembly();
    

    La documentación dice esto:

    Remarks For performance reasons, you should call this method only when you do not know at design time what assembly is currently executing. The recommended way to retrieve an Assembly object that represents the current assembly is to use the Type.Assembly property of a type found in the assembly, as the following example illustrates.

    using System;
    using System.Reflection;
    
    public class Example
    {
       public static void Main()
       {
          Assembly assem = typeof(Example).Assembly;
          Console.WriteLine("Assembly name: {0}", assem.FullName);
       }
    }
    // The example displays output like the following:
    //    Assembly name: Assembly1, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null
    

    Pero al usar un código parecido, tal como este:

    System.Reflection.Assembly ensamblado = typeof(AcercaDegsNotasNET).Assembly;
    

    Da error y, sin nada de descripción, solo el nombre del ensamblado desde donde se ha llamado. Y lo curioso es eso, que no pod´çia saber porqué fallaba la aplicación, salvo después de ¡10 intentos! (y porque me imaginaba por dónde iban los tiros), en fin…

    En todas (o casi todas) existe un botón POLÍTICA DE PRIVACIDAD que al pulsarlo te muestra (en el navegador) la política de privacidad, es decir, qué datos personales se recogen.

    Ahora muestra el contenido de elguillemola.com: Política de privacidad en elguillemola.com pero seguramente lo cambiaré a una que sea específica de esta aplicación.

    De todas formas, comentarte que con los datos que facilitas o las notas que escribe yo no hago nada, ni cambairé nada, salvo que tú me lo pidas expresamente, bien porque no tengas acceso o cualquier otra circunstancia que te impida acceder a las notas o tu cuenta de usuario.

    Bueno y creo que esto es todo…

    He escrito tanto con idea de crear una página en elguillemola.com y así poder usarla como ayuda de la aplicación.

    También crearé un video explicativo con las cosas que debes saber sobre la aplicación.

    Si has llegado leyendo hasta aquí… ¡muchas gracias! 🙂

    Y como estamos en las fechas que estamos (30 de diciembre de 2020) te deseo ¡FELICES FIESTAS!

    Guillermo

     

    Galería de fotos / capturas de la versión 2.0.0.33

    De la versión 2..33 solo hay dos que muestra la «nota» de comprobación de si hay una nueva versión, el resto son de las versiones v2.0.0.31 y v2.0.0.32

     

    Nota:

    Pulsa en la foto que quieras ver con más detalle para que se muestre a tamaño real.

    Puedes descargar el "paquete" de instalación desde GitHub:

    Este enlace es para la versión v2.0.0.33.

    Este otro es para la versión v2.0.0.32 (si no te funciona el enlace es que lo has pulsado antes de que yo lo haya publicado 😉 )

     

    Nos vemos.
    Guillermo