Archive

Archive for 18 diciembre 2009

Clase heredada de DataGridTextBoxColumn para validar las teclas presionadas en el DataGrid

18 diciembre, 2009 Deja un comentario

Option Strict Off
Option Explicit On

Imports Microsoft.VisualBasic
Imports System
Imports System.ComponentModel
Imports System.Windows.Forms

Public Class DataGridTextBoxColumnSoloNumeros

   Inherits DataGridTextBoxColumn

   Public Sub New()
      MyBase.New()
      AddHandler Me.TextBox.KeyPress, New System.Windows.Forms.KeyPressEventHandler(AddressOf HandleKeyPress)

   End Sub

   Private Sub HandleKeyPress(ByVal sender As Object, ByVal e As KeyPressEventArgs)
      ‘Aquí puede cambiar el código para que el usuario unicamente presione letras
      ‘o para cambiar las letras minúsculas por MAYÚSCULAS con el ejemplo siguiente
      ‘If e.KeyChar.IsLower(e.KeyChar) Then
      ‘   e.KeyChar.ToUpper(e.KeyChar)
      ‘End If

      ‘Ignora la tecla presionada si no es dígito o tecla de control
      If e.KeyChar.IsDigit(e.KeyChar) Then
         e.Handled = False
      ElseIf e.KeyChar.IsControl(e.KeyChar) Then
         e.Handled = False
      Else
         e.Handled = True
      End If

      ‘Ignora la tecla presionada si el valor es mas grande de cuatro dígitos
      If ((Me.TextBox.Text.Length >= 4) AndAlso Not (e.KeyChar.IsControl(e.KeyChar)) AndAlso Me.TextBox.SelectionLength = 0) Then
         e.Handled = True
      End If

   End Sub

End Class

Recuperar el DataView de un Windows Forms Control dependiente en Visual Basic .NET

17 diciembre, 2009 Deja un comentario
En este artículo se describe cómo recuperar un objeto DataView de un control enlazado de formularios Windows Forms.

Descripción de la técnica

Para enlazar un origen de datos a un control de formularios Windows Forms, puede código usted mismo o utilizar el enlace en tiempo de diseño. Cuando se produce el enlace en tiempo de diseño, deberá tener acceso a la DataView que utiliza el control enlazado. Sin embargo, la DataView no se expone de forma predeterminada en el enlace en tiempo de diseño.

Puede utilizar uno de estos métodos para tener acceso a la DataView :

  • Utilice la clase BindingContext para obtener una referencia al objeto CurrencyManager , que se genera desde el enlace. Posteriormente, utilice el objeto CurrencyManager para obtener una referencia a la DataView . Éste es el método más confiable.

    Para obtener información adicional acerca de cómo utilizar CurrencyManager en Visual Basic. NET, haga clic en el número de artículo siguiente para verlo en Microsoft Knowledge Base:

    308052  (http://support.microsoft.com/kb/308052/EN-US/ ) Cómo: Mostrar los registros secundarios en un DataGrid utilizando Windows Forms mediante Visual Basic .NET primarios y
  • Utilice la propiedad DefaultView del objeto DataTable . Sin embargo, no puede garantizar que el DefaultView de DataTable es la misma DataView que utiliza el control enlazado.

    Por ejemplo, si varios controles DataGrid están enlazados a un DataTable , el enlace puede o no generar objetos DataView adicionales, dependiendo de la sintaxis que utilizar para enlazar. Para obtener más información acerca de cómo las diferencias en sintaxis de enlace pueden generar varios objetos DataView , consulte la sección de Troubleshooting.

En este artículo muestra cómo utilizar la clase BindingContext para tener acceso a la DataView .

 

Requisitos

En la lista siguiente se describe el hardware, el software, la infraestructura de red y los service pack recomendados que se necesitarán:

  • Microsoft Windows 2000 Professional, Microsoft Windows 2000 Server, Microsoft Windows 2000 Advanced Server o Microsoft Windows NT 4.0 Server
  • Microsoft Visual Studio .NET
  • Microsoft SQL Server 7.0 o posterior

En este artículo se supone que está familiarizado con los temas siguientes:

  • Visual Studio .NET
  • Fundamentos y sintaxis de ADO.NET
 

Crear un proyecto y agregar código

  1. Siga estos pasos para crear un nuevo proyecto de aplicación para Windows en Visual Basic. NET:
    1. Inicie Visual Studio NET..
    2. En el menú archivo , seleccione nuevo y, a continuación, haga clic en proyecto .
    3. En el cuadro de diálogo Nuevo proyecto , haga clic en Proyectos de Visual Basic bajo Tipos de proyecto y, después, haga clic en Aplicación para Windows en plantillas .
  2. En la sección General Declarations de Form1, agregue la siguiente línea de código:

    Imports System.Data.SqlClient
    					

  3. Arrastre un objeto SqlDataAdapter desde la sección datos del cuadro de herramientas al formulario.
  4. Siga estos pasos en el Asistente para configuración:
    1. Cuando se inicia el Asistente para configuración, haga clic en siguiente .
    2. Haga clic en Nueva conexión y, a continuación, configurar una conexión a la base de datos Northwind de SQL Server. Haga clic en Aceptar y, a continuación, haga clic en siguiente .
    3. Haga clic en Usar instrucciones SQL y, a continuación, haga clic en siguiente .
    4. Escriba la siguiente cadena de consulta SQL:

      select * from customers
      						

    5. Haga clic en Finalizar .
  5. Haga clic con el botón secundario en SqlDataAdapter en el panel de su formulario y, a continuación, haga clic en Generar conjunto de datos . Asegúrese de que está seleccionado el nuevo y, a continuación, haga clic en Aceptar .
  6. Arrastre un control DataGrid desde el cuadro de herramientas formularios Windows Forms hasta el formulario. Haga clic para seleccionar el DataGrid .
  7. En el panel Propiedades , seleccione el DataSet generado para la propiedad DataSource y, a continuación, haga clic en clientes para la propiedad DataMember .
  8. Haga doble clic en el formulario para agregar un controlador de eventos Form1_Load y, a continuación, agregue el código siguiente al controlador de eventos:

    SqlDataAdapter1.Fill(DataSet11)
    Dim cm As CurrencyManager = CType(Me.BindingContext(DataSet11, "Customers"), CurrencyManager)
    Dim dv As DataView = CType(cm.List, DataView)
    dv.Sort = "contactname DESC"
    						

    Nota : asegúrese de que el DataSet y SqlDataAdapter se denominan según a los objetos que agregó a su formulario.

    Nota : si utiliza la autenticación de SQL, asegúrese de que la contraseña está incluida en la propiedad ConnectionString de SQLConnection1 .

  9. Presione F5 para compilar y ejecutar dicha aplicación. Observe que los datos en el DataGrid se ordenan por nombre de contacto en orden descendente. Ha recuperó satisfactoriamente la DataView del DataGrid enlazado.
Solución de problemas

La sintaxis que utilizar para enlazar un control a un origen de datos determina si el control comparte un objeto CurrencyManager que ya se ha creado o crea un nuevo objeto CurrencyManager . Ser coherente en forma de conjunto DataSource , el DisplayMembers , el DataMembers y las propiedades DataBindings . Si no son coherentes, el objeto BindingContext crea múltiples objetos CurrencyManager del DataSet . Esto puede producir un comportamiento inesperado.

Por ejemplo, si enlaza un control DataGrid en tiempo de diseño estableciendo su propiedad DataSource en DataSet1 y estableciendo la propiedad DataMember a clientes , debe utilizar el código siguiente para enlazar un control TextBox con el mismo DataSet con el mismo CurrencyManager :

TextBox1.DataBindings.Add("text", DataSet1, "customers.contactname")
				

aunque el código para seguir ilustra un ejemplo de enlace de datos válidos, DataGrid está enlazado de forma incoherente. Por lo tanto, este código crea un segundo objeto CurrencyManager .

TextBox1.DataBindings.Add("text", DataSet1.Tables("customers"), "contactname")
				

si desea enlazar un control DataGrid al DataSet y compartir el mismo CurrencyManager que se genera para el control TextBox en el ejemplo de código último de enlace, debe establecer la propiedad DataSource en DataSet1.Customers y deje en blanco la propiedad DataMember .

Problemas con MCAFEE – Herramienta de eliminación de McAfee (mcrem)

16 diciembre, 2009 Deja un comentario
Categorías:Sin categoría

Talking about Una clase sencilla para encriptar cadenas de texto. – Articulos

14 diciembre, 2009 Deja un comentario

 

Necesitaba solucionar este tema y he encontrado esta posible solución.

 

Una clase sencilla para encriptar cadenas de texto. – Articulos

Uno de los problemas clásicos con los que nos enfrentamos los programadores es el de encriptar los datos. La cantidad de situaciones en las que necesitamos encriptar los datos es incontable. 

Normalmente los datos se almacenan en una base de datos, y esta suele ser segura, pero las claves de conexión se encuentran en archivos de texto planos, XML … Incluso hay muchas bases de datos en las que la información de las claves con las que los usuarios se conectan a los sistemas corporativos estan sin encriptar, con lo que además podemos llegar a comprometer la seguridad de todo nuestro sistema.

Existen complejos algoritmos que permiten la encriptación de datos y que garantizan matemáticamente que nadie los puede desencriptar, como es el caso de MD5, utilizado para emitir certificados de seguridad en sistemas SSL. Tambien existen componentes de software que realizan el trabajo de encriptación por nosotros.

Estas soluciones tienen su parte negativa, por un lado los algoritmos seguros no se pueden desencriptar, por lo que no siempre son utiles. Por otro lado los componentes de software desarrollados por compañias pueden llegar a ser muy caros y además es necesario instalarlos en el los servidores, cosa que no siempre es posible. 

La solución son los sistemas de clave pública-privada. Son sistemas en los que la encriptación se basa en un par de claves, con una clave se encriptan los datos y sólo se pueden desencriptar si se conoce la otra.

Nuestra clase esta basada en esta idea. Vamos a desarrollar una clase que escripta cadena basandose en un patrones. La clase está escrita en VB.NET, pero al utilizar unicamente tipos comunes podemos exportarla facimente a cualquier otro lenguaje.

Lo primero que vamos a hacer es crear la clase a la que vamos a llamar Encriptador.

Public Class Encriptador

End Class

La idea de esta clase es definir dos patrones, cada uno con todos los caracteres del idioma, de la A-Z en mayúscula y minuscula, los numeros … y cada uno en un orden diferente y aleatorio. Después aplicaremos un sencillo algoritmo que nos haga correcponder cada elemento de un patrón con otro.

Lo primero que necesitamos definir los patrones,para ello tecleamos el abecedario  y los números en una cadena de texto como esta:

ABCDEFGHIJKLMNÑOPQRSTVWXYZabcdefghijklmnñopqrstvwxyz1234567890

Y ahora la desordenamos hasta que quede ilegible. Asignamos estas cadenas a nuestras cadena de patrón. Definimos las cadenas a nivel de instancia.

Tambien declaramos dos métodos, uno para encriptar la cadena y otro para encriptar una única letra, que además recibe otros dos parámetros, uno denominado variable, que representa la longitud de la cadena a encriptar y otro a_indice, que representa el índice del caracter dentro de la cadena. Con ellas construiremos un sencillo algoritmo, que evitará que alguien pueda establecer una relación del tipo de "la a es la j encriptada" y que hará que cada letra se encripte de modo diferente dependiendo de la longitud de la cadena y de donde esté situada dentro de ella. 

Public Class Encriptador

Private patron_busqueda As String = "0ABIZ2ÑebDNOEcwGl6oSñixq1…"
Private Patron_encripta As String = "vQÑO8dk1VgIPZxAR3UsLD6XBz…"
‘Los patrones están aquí sin terminar por falta de espacio.

Public Function EncriptarCadena (ByVal cadena As String) As String

End Function

Private Function EncriptarCaracter (ByVal caracter As String, _
                                                            ByVal variable As Integer, _
                                                            ByVal a_indice As Integer) As String


End Function

End Class  

 

Ahora escribimos el código para EncriptarCadena, que sencillamente recorre la cadena letra a letra invocando al método de encriptar caracter, pasandole como parémetros el caracter, la longitud de la cadena y el índice de la iteración. El código es muy sencillo.

Public Function

EncriptarCadena (ByVal cadena As String) As String

   Dim idx As Integer  
   Dim result
As String
 
   For idx = 0
To cadena.Length – 1   
     
result += EncriptarCaracter(cadena.Substring(idx, 1), cadena.Length, idx)
  
Next 
   Return
result

End Function

   Ahora tenemos que escribir el método EncriptarCaracter, como hemos visto al declarar el método, recibe tres parámetros, el caracter que queremos encriptar, un entero variable (que será la longitud de la cadena a encriptar) y el indice que ocupa el caracter a encriptar dentro de la cadena que queremos encriptar. Esto nos va a permitir escribir un sencillo algoritmo para devolver el índice que le va a corresponder a nuestro caracter dentro del patron encriptado.

 Private Function

EncriptarCaracter (ByVal caracter As String, _
                                                             ByVal variable As Integer, _
                                                            ByVal a_indice As Integer)
As String
   
   Dim caracterEncriptado As String, indice As Integer

   If patron_busqueda.IndexOf(caracter) <> -1 Then 
      indice =  (patron_busqueda.IndexOf(caracter) + variable + a_indice) Mod patron_busqueda.Length 
      Return
Patron_encripta.Substring(indice, 1)
   End If

   Return caracter

 End Function

   La función busca el índice de mi caracter en la cadena denominada patron_busqueda, si lo encontramos (recordar que tenemos todas las letras y números), lo encriptamos, si no lo encontramos devolvemos el mismo caracter que hemos recibido como parámetro.

   La encriptación en muy sencilla, ¡pero muy efectiva!, encontramos el lugar que ocupa dentro del patron de busqueda el caracter, le sumamos la longitud de la cadena y le sumamos por último el lugar que ocupa el caracter que estamos encriptando dentro de ella. Obtenemos el caracter correspondiente al índice calculado dentro del patron_encriptado. De este modo conseguimos que el mismo caracter se encripte de forma diferente en cada cadena, y que una pequeña modificación en la cadena cambie totalmente la encriptación.

   Este algoritmo plantea un problema, ¿que ocurre cuando la suma de estos tres parámetro es superior a la longitud de los patrones?. Estariamos intentando estraer un elemento que supera los límites de las cadenas patrón. Para solucionar este problema trabajamos con módulos matemáticos. La operación módulo devuelve el resto de la división entera entre dos números. De este modo cuando nuestro índice supera los limites de la cadena, volvemos a la posición inicial.

Ejemplos con operaciones de modulos

15 Mod 20 ==> devuelve 15

20 Mod 20 ==> devuelve 0

21 Mod 20 ==> devuelve 1

45 Mod 20 ==> devuelve 5

   Ya tenemos nuestra clase que encripta cadenas, vamos a escribir una pequeña aplicación de consola que pruebe nuestra clase.

Module Encriptador_Test

Sub Main()

     Dim cadena As String 
     Dim enc As Encriptador 
     enc =New Encriptador() 
     Do 
         Console.WriteLine("Introduzca la cadena que quiera encriptar:")  
        
cadena = Console.ReadLine() 
         Console.WriteLine( " ==> " + enc.EncriptarCadena(cadena)) 
     Loop While cadena <> ""  

End Sub

End Module

   Vamos a ejecutar nuestro programa, y probamos a encriptar varias cadenas.


C:\VB.net\Encriptar\Encriptar\bin>encriptar.exe

Introduzca la cadena que quiera encriptar:
Hola mundo! ==> 9QPz hpKIZ!

Introduzca la cadena que quiera encriptar:
http://www.Devjoker.com ==> feo.Frfxy¥hb.jii

Introduzca la cadena que quiera encriptar:
La misma letra varia aaaaaaaa! ==> YB WMb¤I JC¥yH Q¥CgP v7Ky8qj4!

   Ahora necesitamos escribir lo métodos para desencriptar. Las declaraciones son parecidas.

 

Public Function DesEncriptarCadena(ByVal cadena As String) As String

End Function

Private Function DesEncriptarCaracter(ByVal caracter As String, ByVal variable As Integer, _
                                                                   ByVal a_indice As Integer) As String


End Function
  

 

   La implementación de los métodos tambien es sencilla, si bien el método de desencriptar caracter es algo más complicado, debido a la posibilidad de encontrar índices negativos. Aún así resultan faciles de comprender.

 

 Public Function DesEncriptarCadena(ByVal cadena As String) As String

    Dim idx As Integer
    Dim result As String

       For idx = 0 To cadena.Length – 1
          result+=DesEncriptarCaracter(cadena.Substring(idx, 1),cadena.Length,idx)
       Ne
xt
      
return result
 End Function

 Private Function DesEncriptarCaracter(ByVal caracter As String, _
                                                                   ByVal variable As Integer, _
                                                                   ByVal a_indice As Integer) As String

    Dim indice As Integer

    If Patron_encripta.IndexOf(caracter) <> -1 Then
     
If (Patron_encripta.IndexOf(caracter) – variable – a_indice) > 0 Then
         indice = (Patron_encripta.IndexOf(caracter) – variable – a_indice) Mod Patron_encripta.Length
     
Else
         ‘La línea está cortada por falta de espacio

        
indice = (patron_busqueda.Length) + ((Patron_encripta.IndexOf(caracter)
                                                                 – variable – a_indice) Mod Patron_encripta.Length)
     
End If
     
indice = indice Mod Patron_encripta.Length
     
Return patron_busqueda.Substring(indice, 1)
    Else
     
Return caracter
    End If

 End Function
  

   Con esto ya tenemos escrito todo el código necesario. Como vereis no se trata de un sistema excesivamente seguro, pero para poder desencriptar nuestras cadenas es necesario conocer dos patrones de 64 caracteres, que además han sido generadas de forma aleatoria. Además este código es facilmente portable a cualquier plataforma, dado que se basa completamente en tipos sencillos, cadenas de caracteres, por lo que reescribir el codigo para una clase Java es muy facil.

    Podemos encriptar datos de una forma mas segura a través de algoritmos estandar como TRIPLEDES, en este articulo explicamos como : http://www.devjoker.com/contenidos/Articulos/355/TripleDES-Un-ejemplo-practico-en-C.aspx

   El código necesario para que nuestra aplicación de consola desencripte es trivial, por lo que no lo comentaremos.

   Bueno, espero que oa haya parecido interesante el articulo, saludos y hasta la proxima.

Categorías:Sin categoría