Archivo | VB.net RSS feed for this section

Cómo implementar multiidioma en 5 pasos

24 Jun

Antes de conocer como funcionaba el multiidioma de un navegador, no es que ahora lo conozca en profundidad pero ya hemos roto el hielo, creía que se definía una vez, que lo mismo se puede, y te olvidabas. Tras investigar sobre el tema, la manera más utilizada, hay que recargarla en cada “Response”, así que comparto aquí cómo lo he implementado, espero que te sirva.

Pruebas realizadas con Microsoft Visual Studio Express 2013 for web, C#.

Sigue leyendo

Anuncios

¿Qué es y cómo usar un fichero de recursos?

3 Feb

En este artículo, que os aviso está basado en notas y puede que no quede tan claro como otros, veremos cómo crear, mantener y consumir un fichero de recursos.

¿Qué es un fichero de recursos?
Los ficheros de recursos, son los archivos que no contienen código fuente, los datos de estos recursos se almacenan en formato xml y son constantes, valores fijos para toda la aplicación.
Nos centramos en el uso de los recursos para la traducción de nuestra aplicación en diversos idiomas.
Al distribuir la aplicación ha de incluir el ensamblado de la aplicación principal y el de los satélites o ficheros de recursos, nuevos o modificados. Cuando modifique un fichero de recursos, no será necesario volver a compilar el ensamblado de la aplicación principal.

Creación de un fichero de recursos
La creación de un fichero de recursos es tan sencilla como pulsar el botón derecho sobre la carpeta App_GlobalResources, añadir nuevo elemento y suministrar los valores necesarios a la ventana que aparecerá…

Asignar un nombre y aceptar.

Cargar datos en un fichero de recursos
Una vez creado el fichero, podemos acceder a él, como siempre, haciendo doble click sobre él y se abrirá el fichero con un formato de tabla.

Para añadir datos es tan sencillo como ir rellenando los datos:
• Columna nombre: Identificador por el que se referencia el recurso.
• Columna valor: Texto que mostrará cuando usemos el recurso.
• Columna comentario: Comentario sobre su uso.

Consultar el fichero de recursos
Para poder utilizar el fichero de recursos creado en el apartado anterior, se puede hacer de dos maneras:
i. Incluir en la página Code Behind (aspx.vb) la instrucción Imports Resources.
ii. Sin incluir ningún imports.
Dependiendo de si hemos declarado el uso del fichero Resources o no, tendremos que buscar los recursos de las siguientes formas para cargar nuestra variable de texto TxtMensaje:
TxtMensaje = Resource.msg_NoSeHaEncontrado
TxtMensaje = Resources.Resource.msg_NoSeHaEncontrado
Incluyendo un manejador
Dim rm As ResourceManager
rm = ResourceManager.CreateFileBasedResourceManager(“strings”,”.”,Nothing)

Ejemplo Asignación de los recursos(dependiendo de idioma)
Para poder tener nuestra aplicación en varios idiomas, declaramos un fichero de recursos por cada idioma.

Una vez declarados los ficheros de recursos, habría que declararse una variable en la que almacenar en que idioma mostrar la información, al ser una información dependiente de cada usuario, lo suyo sería declarar una variable de visible para toda la aplicación en la que almacenaríamos la opción elegida por el usuario.

Hay varias maneras de mostrar los mensajes.
1) Ejemplo, aunque he definido K y le he asigando un valor fijo, se podría sustituir, por el valor que este usuario tiene guardado en base de datos, o dependiendo de dónde se accede, o del que ha seleccionado en un combo en la web.

Dim k As String = “ESPAÑOL”

2) Ejemplo, dependiendo del valor de k, iremos a recuperar el valor que nos interesa, a modo de ejemplo.
If k = “ESPAÑOL” Then
CargarMensaje(Resources.SP.saludo)
Else
CargarMensaje(Resources.EN.saludo)
End If

Infragistics Toolbar, o como codificar un menú en 2 pasitos

24 Dic

Infragistics es una empresa dedicada entre otras cosas a generar controles ASP.NET avanzados que permiten crear de forma rápida experiencias de usuario superiores de estilo, con la estabilidad y el rendimiento necesarios para confiar en ellos a la hora de desarrollar.

Uno de estos controles es el ToolBar o barra de menú, una vez instalado el control e insertado en nuestro formulario, hay que cargarlo en modo diseño, por ejemplo, aunque también se puede cargar por código pero eso lo dejo para otra entrada.
Para la definición de las opciones del menú utilizaremos la opción del menú contextual del control seleccionando ActiveX Configure

menu

Paso 1 Cofiguración
Al seleccionar la opción se nos abrirán dos pantallas, una con “como queda el menú” y otra con la definición de las diferentes secciones.
menuConfig

En la ventana “Configuration Control Panel” podemos crear nuevas opciones de nuestro menú con el botón New o editar las existentes con Edit es bastante sencillo, sólo hay que tener cuidado con el tipo de entrada. Button si es una opción de menú que nos abrirá un formulario o Menu si es una opción de menú que nos abrirá un submenú.

Según se vayan declarando las opciones o una vez que tengamos todas creadas, eso da igual, hay que añadirlas al diseño del menú, en el orden y dentro del submenú en el que queramos que se muestren. Para esto no se necesita nada mas que seleccionar de la lista de elementos y arrastrarlo a la posición elegida en el menú. No pasa nada si no aciertas con el orden, lo puedes modificar tantas veces como quieras en diseño.

Bien, supongamos que ya hemos introducido nuestro menú con sus sesenta elementos. Ahora en el código tendremos que ver que id nos han pulsado para poder definir la instrucción a realizar, y aquí está la finalidad de este artículo…
¿Vamos a escribirnos un “select” con las distintas opciones?, si lo hacemos así vamos a perder mucho tiempo y nos arriesgamos a que al ejecutar el id escrito a mano no concuerde con el escrito en la configuración.

Fijaos en este primer plano de la imagen dos.
MenuOpciones

Paso 2 Exportar Id del menú
Pulsando sobre la opción remarcada Copy Tools IDs To Clipboard AS VB ‘Select’ Stament, no necesita traducción, pero Copia los ID de las opciones como una sentencia ‘Select’ de VB. Sólo nos queda pegarlo en el evento ToolClick de nuestro menú.

Espero que con este ejemplo pueda recordar como configurar y exportar los ID de un menú en el futuro y os sirva a vosotros…

Sean felices desarrollando y feliz Navidad.

LinQ – consultas

26 Nov

LINQ o Language Integrated Query es un conjunto herramientas de Microsoft para realizar todo tipo de consultas a distintas fuentes de datos: objetos, xmls, bases de datos, etc… Para ello, usa un tipo de funciones propias, que unifica las operaciones más comunes en todos los entornos, con esto, se consigue un mismo lenguaje para todo tipo de tareas con datos.

En este artículo voy a dejar un ejemplo de cómo utilizar este tipo de consultas, que aunque es un poco lioso al principio se puede llegar a entender.

Aunque no es necesario, es mejor tener alguna noción de SQL, pero no es imprescindible.

A estas alturas, todos sabemos lo que es una clase y como se usa, para este ejemplo vamos a trabajar con una clase ENAcuerdo, definida a continuación

Imports System

Imports System.Collections.Generic

Imports System.Text

Namespace EntidadesNegocio.Administracion

”’ <summary>

”’ EDAcuerdo  – Acuerdos para procuradores.

”’ </summary>

”’ <remarks></remarks>

<Serializable()> _

Partial Public Class ENAcuerdo

Public Sub New()

MyBase.New()

End Sub

Private m_Pk As Nullable(Of Integer)

Private m_Fechainicio As Nullable(Of Date)

Private m_Fechafin As Nullable(Of Date)

”’ <summary>

”’ Identificador único del acuerdo.

”’ </summary>

”’ <value></value>

”’ <returns></returns>

”’ <remarks></remarks>

Public Property Pk() As Nullable(Of Integer)

Get

Return m_Pk

End Get

Set(ByVal value As Nullable(Of Integer))

m_Pk = value

End Set

End Property

”’ <summary>

”’ Fecha de entrada en vigencia del acuerdo.

”’ </summary>

”’ <value></value>

”’ <returns></returns>

”’ <remarks></remarks>

Public Property Fechainicio() As Nullable(Of Date)

Get

Return m_Fechainicio

End Get

Set(ByVal value As Nullable(Of Date))

m_Fechainicio = value

End Set

End Property

”’ <summary>

”’ Fecha de fin de vigencia del acuerdo.

”’ </summary>

”’ <value></value>

”’ <returns></returns>

”’ <remarks></remarks>

Public Property Fechafin() As Nullable(Of Date)

Get

Return m_Fechafin

End Get

Set(ByVal value As Nullable(Of Date))

m_Fechafin = value

End Set

End Property

End Class

End Namespace

Recordamos que las clases deben estar organizadas en espacios de nombres para que sea más fácil su localización y tener una idea de para que son.

Linq lo utilizamos para consultas, así que necesitamos una colección que contenga más de una entidad…

Namespace ColeccionesNegocio.Administracion

”’ <summary>

”’ Colección negocio ENAcuerdo – Acuerdos para procuradores.

”’ </summary>

”’ <remarks></remarks>

Public Class CNAcuerdo

Inherits System.Collections.CollectionBase

Implements ICollection(Of

EntidadesNegocio.Administracion.ENAcuerdo)

Public Function ToList() As List(Of

EntidadesNegocio.Administracion.ENAcuerdo)

Return List.Cast(Of

EntidadesNegocio.Administracion.ENAcuerdo).ToList

End Function

Public Function Item(ByVal index As Integer) As

EntidadesNegocio.Administracion.ENAcuerdo

Return List.Item(index)

End Function

Public Sub Add(ByVal item As EntidadesNegocio.Administracion.ENAcuerdo) Implements System.Collections.Generic.ICollection(Of EntidadesNegocio.Administracion.ENAcuerdo).Add

List.Add(item)

End Sub

Shadows Sub Clear1() Implements System.Collections.Generic.ICollection(Of EntidadesNegocio.Administracion.ENAcuerdo).Clear

List.Clear()

End Sub

Public Function Contains(ByVal item As EntidadesNegocio.Administracion.ENAcuerdo) As Boolean Implements

System.Collections.Generic.ICollection(Of EntidadesNegocio.Administracion.ENAcuerdo).Contains

Return List.Contains(item)

End Function

Public Sub CopyTo(ByVal array() As EntidadesNegocio.Administracion.ENAcuerdo, ByVal arrayIndex As

Integer) Implements System.Collections.Generic.ICollection(Of EntidadesNegocio.Administracion.ENAcuerdo).CopyTo

List.CopyTo(array, arrayIndex)

End Sub

Shadows ReadOnly Property Count1() As Integer Implements System.Collections.Generic.ICollection(Of

EntidadesNegocio.Administracion.ENAcuerdo).Count

Get

Return List.Count

End Get

End Property

Public ReadOnly Property IsReadOnly() As Boolean Implements System.Collections.Generic.ICollection(Of EntidadesNegocio.Administracion.ENAcuerdo).IsReadOnly

Get

Return List.IsReadOnly

End Get

End Property

Public Function Remove(ByVal item As EntidadesNegocio.Administracion.ENAcuerdo) As Boolean Implements

System.Collections.Generic.ICollection(Of EntidadesNegocio.Administracion.ENAcuerdo).Remove

If List.Contains(item) Then

List.Remove(item)

Return True

Else

Return False

End If

End Function

Shadows Function GetEnumerator1() As System.Collections.Generic.IEnumerator(Of EntidadesNegocio.Administracion.ENAcuerdo) Implements System.Collections.Generic.IEnumerable(Of EntidadesNegocio.Administracion.ENAcuerdo).GetEnumerator

Return List.GetEnumerator

End Function

End Class

End Namespace

Ya tenemos una colección, ahora hagamos un ejemplo sencillo de los de internet.

Supongamos que queremos recuperar los acuerdos en que la fecha de inicio sea mayor a hoy, para ello en lugar de filtar la colección mediante su operación de negocio y creación y carga de filtro, utilizamos linq.

Dim lista = (From acuerdo As GRMMapper.EntidadesNegocio.Administracion.ENAcuerdo _

In colAcuerdos.ToList _

Where  (acuerdo.Fechainicio >= now) _

Select acuerdo)

Nos creamos una variable en la que almacenaremos los datos obtenidos de la consulta.

Importante, a mí me pasa a menudo, no olvidar convertir la colección a una lista (colAcuerdos.ToList)

Recorremos la colección de acuerdos, convertida en lista, de acuerdo en acuerdo.

Where, cláusula como en sql con la condición,

Y el dato a recuperar, Select acuerdo, podríamos sólo haber recuperado la fechafin, poniendo

acuerdo.Fechafin

En lista, tendríamos almacenado una colección de acuerdos filtrados en una sola línea.

Hasta aquí fácil, ahora un ejemplo de una INNER JOIN este más complicado de encontrar por internet.

Imaginemos que tenemos otra entidad en la que relacionamos los acuerdos con los procuradores que los firman cada año.

Imports System

Imports System.Collections.Generic

Imports System.Text

Namespace EntidadesNegocio.Administracion

”’ <summary>

”’ EDAcuerdoprocurador  – Relación de Acuerdos y procuradores

”’ </summary>

”’ <remarks></remarks>

<Serializable()> _

Partial Public Class ENAcuerdoprocurador

Public Sub New()

MyBase.New()

End Sub

Private m_Pk As Nullable(Of Integer)

Private m_Fkacuerdo As Nullable(Of Integer)

Private m_Fkprocurador As Nullable(Of Integer)

”’ <summary>

”’ Identificador único del acuerdo-procurador.

”’ </summary>

”’ <value></value>

”’ <returns></returns>

”’ <remarks></remarks>

Public Property Pk() As Nullable(Of Integer)

Get

Return m_Pk

End Get

Set(ByVal value As Nullable(Of Integer))

m_Pk = value

End Set

End Property

”’ <summary>

”’ Identificador del acuerdo.

”’ </summary>

”’ <value></value>

”’ <returns></returns>

”’ <remarks></remarks>

Public Property Fkacuerdo() As Nullable(Of Integer)

Get

Return m_Fkacuerdo

End Get

Set(ByVal value As Nullable(Of Integer))

m_Fkacuerdo = value

End Set

End Property

”’ <summary>

”’ Identificador del procurador.

”’ </summary>

”’ <value></value>

”’ <returns></returns>

”’ <remarks></remarks>

Public Property Fkprocurador() As Nullable(Of Integer)

Get

Return m_Fkprocurador

End Get

Set(ByVal value As Nullable(Of Integer))

m_Fkprocurador = value

End Set

End Property

End Class

End Namespace

Ahora vamos a ver como enlazar las dos entidades en una línea…

Supongamos que queremos recuperar los acuerdos de los procuradores que cuya fecha de finalización no ha llegado o es hoy.

Dim listaAcuerdosVigentesFuturos = _

(From acuerdo As EntidadesNegocio.Administracion.ENAcuerdo In colAcuerdos.ToList _

Join ap As EntidadesNegocio.Administracion.ENAcuerdoprocurador In colAP.ToList _

On acuerdo.Pk Equals ap.Fkacuerdo  Where acuerdo.Fechafin >= Now _

Select acuerdo)

From: Definimos la entidad origen (.ToList)

Join: definimos la entidad con la que comparar (.ToList)

On: Como en SQL definimos cuál es la relación entre las entidades.

Where: Definimos la condición de filtrado.

Select: Definimos el dato a recuperar, hemos puesto acuerdo, pero podríamos haber puesto ap

o acuerdo.fechainicio, acuerdo.fechafin, ap.fkprocurador.

Espero que con este ejemplo pueda recordar como se usa LINQ en el futuro y os sirva a vosotros…

Sean felices desarrollando.

Crea y utiliza tu “Manejador de configuración” en 3 pequeños pasitos.

10 Dic

El archivo de configuración de la aplicación vb.Net es el web.config, dónde tenemos almacenadas todas las rutas a las distintas bases de datos, los usuarios y claves, perfiles específicos, etc…

Para acceder a esta información se suele acceder con churros del estilo a; System.Configuration.ConfigurationManager.AppSettings(“CONSULTA_MENU_USUARIO”) o bien, y es lo que os voy a tratar de explicar hoy, utilizar un “Manejador de Configuración” o clase en el que volcar toda la información definida en el web.config y acceder a ella desde cualquier lugar de la aplicación. 

El “Manejador de Configuración” nos va a permitir tener un punto de acceso único al web.config y así nos resultará más fácil el mantener la relación entre el fichero de configuración y la aplicación.

Para crear y utilizar el “Manejador de Configuración” desde cualquier lugar de la aplicación hay que seguir 3 pequeños pasitos:

  1. Modificación del fichero de configuración (web.config).
    Hay que modificar el fichero de configuración de la aplicación para indicarle, quien va a ser la sección que almacene las especificaciones a volcar en la clase y que clase va a ser.

    En el siguiente ejemplo vemos como quedaría el web.config desnudo, solo lo que nos interesa:

    <configuration xmlns=”http://schemas.microsoft.com/.NetConfiguration/v2.0″&gt;

    <configSections>

    <section name =”LectorConfiguracion” type=”EspacioDeNombres.LectorConfig”/>

    </configSections>

    <LectorConfiguracion>

    <add key=”Version_SQL_Server” value=”2005″/>

    </ LectorConfiguracion>

    Dentro de la sección “configSections” he creado una nueva sección “LectorConfiguracion” en un alarde de originalidad y le indico que es del tipo EspacioDeNombres.LectorConfig, que es la clase que me he creado.

    La otra modificación que hay que hacer en el web.config es la de añadir toda la configuración que vamos a leer desde nuestra clase LectorConfig y para ello creamos un nuevo nodo, “LectorConfiguración”, se tiene que llamar igual que la sección definida en el configSections.

    Yo sólo he añadido la versión de SQL que voy a usar y le he dado un valor, pero puedes añadir todo lo que quieras. Podrías añadir toda la antigua configuración del web.config…

    Hecho esto, ya está el web.config modificado, guardamos los datos y listo.

  2. Creación del “Manejador de Configuración”.
    La clase manejadora se crea como una clase Public NotInheritable, dentro de nuestro espacio de nombres e implementando IConfigurationSectionHandler, interfaz que controla el acceso a determinadas secciones de configuración.

    Variables privadas y compartidas a declarar:

    Con la fórmula siguiente se declararán todas las propiedades a recuperar del web.config.

    Private Shared _DSNSQL as String

    Este ejemplo es con el DSN declarado como string, pero puede ser declarado con cualquier tipo de dato, string, Boolean, entero, etc… tendrás que convertir al tipo deseado lo que recibas del web.config.

    Nuestro “Manejador de Configuración” no puede ser instanciado desde ninguna parte de la aplicación, así que declaramos las propiedades de tipo shared

    Public Shared ReadOnly Property DSNSQL() As string, Declaramos el Get, ya que no tiene sentido que cambie los valores de configuración.

    La chicha está en los métodos Inicializar y Create que son los métodos que vamos a emplear para leer la configuración del web.config y para cargar dicha información a nuestros miembros, respectivamente.

    En nuestro Manejador de configuración creamos los métodos:

    Public Shared Sub Inicializar()

    System.Configuration.ConfigurationManager.GetSection(“LectorConfiguracion”)

    End Sub

    Método encargado de leer la sección de configuración dentro de nuestro web.config, al leer esta sección se dispara un determinado evento haciendo que el compilador ejecute el contrato especificado por nuestra interface implementada. Me refiero a la función “Create”

    Private Function Create(ByVal parent As Object, _
    ByVal configContext As Object, _
    ByVal section As System.Xml.XmlNode) As Object _
    Implements System.Configuration.IConfigurationSectionHandler.Create

    Dim sh As NameValueSectionHandler
    Dim nv As NameValueCollection
    sh = New NameValueSectionHandler
    nv = CType(sh.Create(parent, configContext, section), NameValueCollection)

    If Not nv Is Nothing Then
    _DSNSQL = nv.Item(“DSNSQL”) ‘Aquí recupero sólo el DNSQL, pero vosotros recuperaríais todos los valores.
    End if
    sh = Nothing
    nv = Nothing

    Return Me ‘Devuelvo la clase cargada con los valores de configuración.

    End Function

  3. Invocar la carga del Manejador de Configuración con los datos del web.config.

    Parece lo más lógico que si en esta clase vamos a recuperar todos los datos de configuración de la aplicación, que los recuperemos antes de realizar cualquier operación en la aplicación.

    Abre el archivo global.asa y en el start de la aplicación recupera la configuracion del web.config, de la siguiente manera.

    LectorConfig.Inicializar()

    Al recuperar la configuración, se lanza el evento create que declaramos en nuestra clase.

    Si esto no te ha producido ningún error, ya puedes usar tu Manejador de congiguración, desde cualquier parte de tu solución.

Hasta aquí, los 3 pasitos para realizar un “Manejador de Configuración”, espero os sea útil…

La que has liado

Fotografiar con palabras, nuestro momento, nuestra época. Del 1.1 al 2.0

TERZERO

Pio Baroja

El árbol inútil

Blog de cuentos, libros y mala poesía

tu.deinflexión

somos dueños de nuestro destino, inventores de nuestro futuro y nuestra felicidad...

Frikstation

Pasión por el mundo de la televisión, el cine, los videojuegos y su merchandising.

A %d blogueros les gusta esto: