Mostrando entradas con la etiqueta algoritmo. Mostrar todas las entradas
Mostrando entradas con la etiqueta algoritmo. Mostrar todas las entradas

viernes, 20 de septiembre de 2013

Programa de Facturacion V.6

Bueno ya lo termine espero que les guste, lo subo aquí al principio.
Es un archivo .Rar, lo descomprimes y hay un ejecutable denominado Facturacion_6v.exe.
Instalara todo lo nesesario para su funcionamiento.

Como mejora, está el guardar la factura en formato .xlsm y poderse modificar.
He mejorado el inventario, se puede llevar un control de Stock.
Control de Entradas, Salidas.
Se puede llevar la contabilidad, buscar por periodos la contabilidad.

Cualquier duda o futura mejora, aquí estoy.

En breve hare un pequeño tutorial.
Las primeras versiones eran muy simples, creo que no hacia falta muchas explicaciones.Me comento una Amiga que lo usa en el trabajo, que cuando habian muchos clientes al agregar mas clientes iba muy lento, SOLUCIONADO.

Descarga el Archivo Aqui:

jueves, 14 de marzo de 2013

Cambiarle el nombre a un archivo en Visual Basic.NET 2008


para este ejemplo agregamos 2 botones y en el boton examinar ponemos este codigo:
' presentar al usuario un cuadro de diálogo
        Dim openFile As New OpenFileDialog
        ' si elegimos algún archivo
        Dim result As DialogResult = openFile.ShowDialog()
        If result = DialogResult.OK Then
            TextBox1.Text = openFile.FileName
        End If
al pulsar el boton nos saldra este objeto:

Escribimos eln ombre del archivo en el textbox2 y al pulsar el boton Cambiar Nombre lo habra cambiado, para esto escribimos este codigo en el evento click del boton Cambiar Nombre
My.Computer.FileSystem.RenameFile(TextBox1.Text, TextBox2.Text)

Eliminar un directorio completo en Visual Basic .NET 2008

Este articulo nos permitira buscar un archivo y luego eliminarlo. para este articulo crearemos un proyecto y con los objetos que aparecen en la imagen. y usaremos la libreria System.IO.

Imports System.IO

Dentro del boton examinar definiremos un FolderBrowserDialog que nos permitira identificar la carpeta donde se encuentran los archivos en los cuales haremos la busqueda. agregaremos al Textbox (Textbox1) la ruta del directorio.


Dim Dir As New FolderBrowserDialog
        If Dir.ShowDialog = Windows.Forms.DialogResult.OK Then
            TextBox1.Text = Dir.SelectedPath
        End If
Ahora que tenemos la ruta del archivo en nuestro textbox este sera el codigo en el boton eliminar:
Try
            Dim midirectorio As String = TextBox1.Text

            My.Computer.FileSystem.DeleteDirectory(midirectorio, FileIO.UIOption.AllDialogs, FileIO.RecycleOption.SendToRecycleBin, FileIO.UICancelOption.DoNothing)

        Catch ex As Exception
            MsgBox(ex.Message.ToString, MsgBoxStyle.Critical)
        End Try
al pulsar el boton eliminar nos saldra este mensaje

pulsamos el boton Si y listo se eliminara la carpeta con todo su contenido dentro. Espero este ejemplo les haya servido.

martes, 12 de marzo de 2013

C# Visual Basic .NET 2008:Eliminar fila desde un DatGridView al presionar Suprimir


En formularios donde se necesita agregar registros a un control DataGridView por ejemplo: al detalle de una factura, es típico que el usuario se equivoque e inserte un registro que no corresponde. Una solución puede ser que seleccione el registro y presione la tecla Suprimir para eliminar el registro. La manera de hacerlo es la siguiente:
Agregar este código en el evento KeyDown del DataGridView:
int XSaint = 0;
            if (e.KeyCode == Keys.Delete)
            {
                e.Handled = true;
                XSaint = ((DataGridView)sender).CurrentRow.Index;
                dataGridView1.Rows.RemoveAt(XSaint);
            }

lunes, 11 de marzo de 2013

Truco C# en .NET 2008:Como generar passwords aleatorios


creamos una clase RandomPassword.cs y agregamos este codigo:

using System.Security.Cryptography;

namespace WindowsFormsApplication1
{
    public class RandomPassword
    {
        // Define default min and max password lengths.
        private static int DEFAULT_MIN_PASSWORD_LENGTH = 8;
        private static int DEFAULT_MAX_PASSWORD_LENGTH = 10;

        // Define supported password characters divided into groups.
        // You can add (or remove) characters to (from) these groups.
        private static string PASSWORD_CHARS_LCASE = "abcdefgijkmnopqrstwxyz";
        private static string PASSWORD_CHARS_UCASE = "ABCDEFGHJKLMNPQRSTWXYZ";
        private static string PASSWORD_CHARS_NUMERIC = "23456789";
        private static string PASSWORD_CHARS_SPECIAL = "*$-+?_&=!%{}/";


        public static string Generate()
        {
            return Generate(DEFAULT_MIN_PASSWORD_LENGTH,
                            DEFAULT_MAX_PASSWORD_LENGTH);
        }


        public static string Generate(int length)
        {
            return Generate(length, length);
        }


        public static string Generate(int minLength,
                                      int maxLength)
        {
            // Make sure that input parameters are valid.
            if (minLength <= 0 || maxLength <= 0 || minLength > maxLength)
                return null;


            char[][] charGroups = new char[][] 
        {
            PASSWORD_CHARS_LCASE.ToCharArray(),
            PASSWORD_CHARS_UCASE.ToCharArray(),
            PASSWORD_CHARS_NUMERIC.ToCharArray(),
            PASSWORD_CHARS_SPECIAL.ToCharArray()
        };

            // Use this array to track the number of unused characters in each
            // character group.
            int[] charsLeftInGroup = new int[charGroups.Length];

            // Initially, all characters in each group are not used.
            for (int i = 0; i < charsLeftInGroup.Length; i++)
                charsLeftInGroup[i] = charGroups[i].Length;

            // Use this array to track (iterate through) unused character groups.
            int[] leftGroupsOrder = new int[charGroups.Length];

            // Initially, all character groups are not used.
            for (int i = 0; i < leftGroupsOrder.Length; i++)
                leftGroupsOrder[i] = i;




            byte[] randomBytes = new byte[4];

            // Generate 4 random bytes.
            RNGCryptoServiceProvider rng = new RNGCryptoServiceProvider();
            rng.GetBytes(randomBytes);

            // Convert 4 bytes into a 32-bit integer value.
            int seed = (randomBytes[0] & 0x7f) << 24 |
                        randomBytes[1] << 16 |
                        randomBytes[2] << 8 |
                        randomBytes[3];

            // Now, this is real randomization.
            Random random = new Random(seed);

            // This array will hold password characters.
            char[] password = null;

            // Allocate appropriate memory for the password.
            if (minLength < maxLength)
                password = new char[random.Next(minLength, maxLength + 1)];
            else
                password = new char[minLength];

            // Index of the next character to be added to password.
            int nextCharIdx;

            // Index of the next character group to be processed.
            int nextGroupIdx;

            // Index which will be used to track not processed character groups.
            int nextLeftGroupsOrderIdx;

            // Index of the last non-processed character in a group.
            int lastCharIdx;

            // Index of the last non-processed group.
            int lastLeftGroupsOrderIdx = leftGroupsOrder.Length - 1;

            // Generate password characters one at a time.
            for (int i = 0; i < password.Length; i++)
            {

                if (lastLeftGroupsOrderIdx == 0)
                    nextLeftGroupsOrderIdx = 0;
                else
                    nextLeftGroupsOrderIdx = random.Next(0,
                                                         lastLeftGroupsOrderIdx);

                // Get the actual index of the character group, from which we will
                // pick the next character.
                nextGroupIdx = leftGroupsOrder[nextLeftGroupsOrderIdx];

                // Get the index of the last unprocessed characters in this group.
                lastCharIdx = charsLeftInGroup[nextGroupIdx] - 1;

                // If only one unprocessed character is left, pick it; otherwise,
                // get a random character from the unused character list.
                if (lastCharIdx == 0)
                    nextCharIdx = 0;
                else
                    nextCharIdx = random.Next(0, lastCharIdx + 1);

                // Add this character to the password.
                password[i] = charGroups[nextGroupIdx][nextCharIdx];

                // If we processed the last character in this group, start over.
                if (lastCharIdx == 0)
                    charsLeftInGroup[nextGroupIdx] =
                                              charGroups[nextGroupIdx].Length;
                // There are more unprocessed characters left.
                else
                {
                    // Swap processed character with the last unprocessed character
                    // so that we don't pick it until we process all characters in
                    // this group.
                    if (lastCharIdx != nextCharIdx)
                    {
                        char temp = charGroups[nextGroupIdx][lastCharIdx];
                        charGroups[nextGroupIdx][lastCharIdx] =
                                    charGroups[nextGroupIdx][nextCharIdx];
                        charGroups[nextGroupIdx][nextCharIdx] = temp;
                    }
                    // Decrement the number of unprocessed characters in
                    // this group.
                    charsLeftInGroup[nextGroupIdx]--;
                }

                // If we processed the last group, start all over.
                if (lastLeftGroupsOrderIdx == 0)
                    lastLeftGroupsOrderIdx = leftGroupsOrder.Length - 1;
                // There are more unprocessed groups left.
                else
                {
                    // Swap processed group with the last unprocessed group
                    // so that we don't pick it until we process all groups.
                    if (lastLeftGroupsOrderIdx != nextLeftGroupsOrderIdx)
                    {
                        int temp = leftGroupsOrder[lastLeftGroupsOrderIdx];
                        leftGroupsOrder[lastLeftGroupsOrderIdx] =
                                    leftGroupsOrder[nextLeftGroupsOrderIdx];
                        leftGroupsOrder[nextLeftGroupsOrderIdx] = temp;
                    }
                    // Decrement the number of unprocessed groups.
                    lastLeftGroupsOrderIdx--;
                }
            }

            // Convert password characters into a string and return the result.
            return new string(password);
        }
    }
}
ahora en el boton ponemos este codigo:
textBox1.Text = RandomPassword.Generate(8,10);
y listo =) espero les haya servido el ejemplo

sábado, 15 de diciembre de 2012

Validación con expresiones regulares en C#.NET

Las expresiones regulares son modelos que describen las combinaciones de caracteres en el texto. Se podrían definir como una serie de carácteres que forman un patrón, que representan a otro grupo de carácteres mayor, de tal forma que podemos comparar el patrón con otros conjuntos de carácteres para ver las coincidencias. Las expresiones regulares pueden utilizarse en múltiples lenguajes de programación pero en esta entrada vamos a ver un ejemplo de validación de formularios mediante Javascript y haciendo uso de expresiones regulares.
Un buen tutorial para iniciarse en el manejo de expresiones regulares lo podemos encontrar en Desarrolloweb. Para realizar el ejemplo siguiente no hay porque conocer en profundidad su manejo. A continuación muestro una serie de tablas a modo de chuleta para que podamos utilizarlas con un simple corta y pega.
La tabla siguiente contiene los caracteres especiales de las expresiones regulares.
Carácter Texto buscado
^ Principio de entrada o línea.
$ Fin de entrada o línea.
* El carácter anterior 0 o más veces.
+ El carácter anterior 1 o más veces.
? El carácter anterior una vez como máximo (es decir, indica que el carácter anterior es opcional).
. Cualquier carácter individual, salvo el de salto de línea.
x|y x o y.
{n} Exactamente n apariciones del carácter anterior.
{n,m} Como mínimo n y como máximo m apariciones del carácter anterior.
[abc] Cualquiera de los caracteres entre corchetes. Especifique un rango de caracteres con un guión (por ejemplo, [a-f] es equivalente a [abcdef]).
[^abc] Cualquier carácter que no esté entre corchetes. Especifique un rango de caracteres con un guión (por ejemplo, [^a-f] es equivalente a [^abcdef]).
\b Límite de palabra (como un espacio o un retorno de carro).
\B Cualquiera que no sea un límite de palabra.
\d Cualquier carácter de dígito. Equivalente a [0-9].
\D Cualquier carácter que no sea de dígito. Equivalente a [^0-9].
\f Salto de página.
\n Salto de línea.
\r Retorno de carro.
\s Cualquier carácter individual de espacio en blanco (espacios, tabulaciones, saltos de página o saltos de línea).
\S Cualquier carácter individual que no sea un espacio en blanco.
\t Tabulación.
\w Cualquier carácter alfanumérico, incluido el de subrayado. Equivalente a [A-Za-z0-9_].
\W Cualquier carácter que no sea alfanumérico. Equivalente a [^A-Za-z0-9_].
La tabla siguiente contiene algunos de los patrones más utilizados a la hora de validar formularios. Si alguien conoce alguna expresión regular más -que pueda ser útil en la validación de formularios- la puede poner en los comentarios y yo la incorporaré a esta tabla.
Cualquier letra en minuscula [a-z]
Entero ^(?:\+|-)?\d+$
Correo electrónico /[\w-\.]{3,}@([\w-]{2,}\.)*([\w-]{2,}\.)[\w-]{2,4}/
URL ^(ht|f)tp(s?)\:\/\/[0-9a-zA-Z]([-.\w]*[0-9a-zA-Z])*(:(0-9)*)*(\/?)( [a-zA-Z0-9\-\.\?\,\'\/\\\+&%\$#_]*)?$
Contraseña segura (?!^[0-9]*$)(?!^[a-zA-Z]*$)^([a-zA-Z0-9]{8,10})$(Entre 8 y 10 caracteres, por lo menos un digito y un alfanumérico, y no puede contener caracteres espaciales)
Fecha ^\d{1,2}\/\d{1,2}\/\d{2,4}$(Por ejemplo 01/01/2007)
Hora ^(0[1-9]|1\d|2[0-3]):([0-5]\d):([0-5]\d)$(Por ejemplo 10:45:23)
Número tarjeta de crédito ^((67\d{2})|(4\d{3})|(5[1-5]\d{2})|(6011))(-?\s?\d{4}){3}|(3[4,7])\ d{2}-?\s?\d{6}-?\s?\d{5}$
Número teléfono ^[0-9]{2,3}-? ?[0-9]{6,7}$
Código postal ^([1-9]{2}|[0-9][1-9]|[1-9][0-9])[0-9]{3}$
Certificado Identificación Fiscal ^(X(-|\.)?0?\d{7}(-|\.)?[A-Z]|[A-Z](-|\.)?\d{7}(-|\.)? [0-9A-Z]|\d{8}(-|\.)?[A-Z])$
Valida sólo números del 1 al 12 (ideal para meses) ^([0-1]?[0-2]|[0-9])$
Valida de 0.1 a 9.9 ^([0-9].[1-9])$
Valida desde 10.01 hasta 99.99 con 2 decimales máximo ^[0-9][0-9](.[0-9][0-9])$
Valida desde 0.01 hasta 99.99 con sólo 2 decimales máximo ^[0-9]?[0-9](.[0-9][0-9])$
Aquí les dejo el código:
private void txtcodigo_KeyUp(object sender, KeyEventArgs e)
        {
            if (es_numero(txtcodigo))
            {
                errorProvider1.SetError(txtcodigo, String.Empty);
                txtcodigo.BackColor = Color.Honeydew;
            }
            else
            {
                errorProvider1.SetError(txtcodigo, "Solo numeros");
                txtcodigo.BackColor = Color.MistyRose;
            }
        }

        private void txtemail_KeyUp(object sender, KeyEventArgs e)
        {
            if (es_email(txtemail))
            {
                errorProvider1.SetError(txtemail, String.Empty);
                txtemail.BackColor = Color.Honeydew;
            }
            else
            {
                errorProvider1.SetError(txtemail, "ejemplo@ejemplo.com");
                txtemail.BackColor = Color.MistyRose;
            }
        }


        private void txtnombre_KeyUp(object sender, KeyEventArgs e)
        {
            if (es_cadena(txtnombre))
            {
                errorProvider1.SetError(txtnombre, String.Empty);
                txtnombre.BackColor = Color.Honeydew;
            }
            else
            {
                errorProvider1.SetError(txtnombre, "Solo letras");
                txtnombre.BackColor = Color.MistyRose;
            }
        }

        private void txttelf_KeyUp(object sender, KeyEventArgs e)
        {
            if (es_telefono(txttelf))
            {
                errorProvider1.SetError(txttelf, String.Empty);
                txttelf.BackColor = Color.Honeydew;
            }
            else
            {
                errorProvider1.SetError(txttelf, "Formato: 999-9999");
                txttelf.BackColor = Color.MistyRose;
            }
        }

        private void txtweb_KeyUp(object sender, KeyEventArgs e)
        {
            if (es_url(txtweb))
            {
                errorProvider1.SetError(txtweb, String.Empty);
                txtweb.BackColor = Color.Honeydew;
            }
            else
            {
                errorProvider1.SetError(txtweb, "www.example.com");
                txtweb.BackColor = Color.MistyRose;
            }
        }

        private void txtsueldo_KeyUp(object sender, KeyEventArgs e)
        {
            if (es_decimal(txtsueldo))
            {
                errorProvider1.SetError(txtsueldo, String.Empty);
                txtsueldo.BackColor = Color.Honeydew;
            }
            else
            {
                errorProvider1.SetError(txtsueldo, "Formato: 00,00");
                txtsueldo.BackColor = Color.MistyRose;
            }
        }

        private static bool es_numero(Control mitextbox)
        {

            Regex regex = new Regex(@"^[0-9]+$");
            return regex.IsMatch(mitextbox.Text);

        }

        private static bool es_cadena(Control mitextbox)
        {

            Regex regex = new Regex(@"^[^ ][a-zA-Z ]+[^ ]$");
            return regex.IsMatch(mitextbox.Text);

        }

        private static bool es_telefono(Control mitextbox)
        {

            Regex regex = new Regex(@"^([0-9]{3})[-. ]?([0-9]{4})$");
            return regex.IsMatch(mitextbox.Text);
            
        }

        private static bool es_decimal(Control mitextbox)
        {

            Regex regex = new Regex(@"^[0-9]{1,9}([\.\,][0-9]{1,3})?$");
            return regex.IsMatch(mitextbox.Text);
            
        }

        private static bool es_url(Control mitextbox)
        {

            Regex regex = new Regex(@"^[a-zA-Z0-9\-\.]+\.(com|org|net|mil|edu|COM|ORG|NET|MIL|EDU)$");
            return regex.IsMatch(mitextbox.Text);
        }

        private static bool es_email(Control mitextbox)
        {
            
            Regex regex = new Regex(@"^(?("")(""[^""]+?""@)|(([0-9a-z]((\.(?!\.))|[-!#\$%&'\*\+/=\?\^`\{\}\|~\w])*)(?<=[0-9a-z])@))" +
                @"(?(\[)(\[(\d{1,3}\.){3}\d{1,3}\])|(([0-9a-z][-\w]*[0-9a-z]*\.)+[a-z0-9]{2,17}))$");

            // Resultado: 
            //       Valid: david.jones@proseware.com 
            //       Valid: d.j@server1.proseware.com 
            //       Valid: jones@ms1.proseware.com 
            //       Invalid: j.@server1.proseware.com 
            //       Invalid: j@proseware.com9 
            //       Valid: js#internal@proseware.com 
            //       Valid: j_9@[129.126.118.1] 
            //       Invalid: j..s@proseware.com 
            //       Invalid: js*@proseware.com 
            //       Invalid: js@proseware..com 
            //       Invalid: js@proseware.com9 
            //       Valid: j.s@server1.proseware.com

            return regex.IsMatch(mitextbox.Text);

        }
Este codigo va para el boton Nuevo
txtcodigo.Text = String.Empty;
            txtcodigo.BackColor = Color.White;
            errorProvider1.SetError(txtcodigo,String.Empty);

            txtnombre.Text = String.Empty;
            txtnombre.BackColor = Color.White;
            errorProvider1.SetError(txtnombre, String.Empty);

            txttelf.Text = String.Empty;
            txttelf.BackColor = Color.White;
            errorProvider1.SetError(txttelf, String.Empty);

            txtweb.Text = String.Empty;
            txtweb.BackColor = Color.White;
            errorProvider1.SetError(txtweb, String.Empty);

            txtemail.Text = String.Empty;
            txtemail.BackColor = Color.White;
            errorProvider1.SetError(txtemail, String.Empty);

            txtsueldo.Text = String.Empty;
            txtsueldo.BackColor = Color.White;
            errorProvider1.SetError(txtsueldo, String.Empty);
y este codigo va en el boton Grabar
if (es_numero(txtcodigo) == true && es_cadena(txtnombre) == true && es_telefono(txttelf) == true &&
                es_url(txtweb) == true && es_email(txtemail) == true && es_decimal(txtsueldo) == true)
            {
                MessageBox.Show("OK");
            }
            else
            {
                MessageBox.Show("Complete todos los campos.");
            }

Truco:Pasar Texto a Binario en Visual Basic.Net

Simple aplicación que convierte un texto a binario. Espero pronto cargar esta misma aplicación con la funcion de convertir binario a texto… Pero mientras, el fomulario quedaría así:
Su código es el siguiente y puedes descargar la aplicación desde AQUI
Private Sub btnaBinario_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnaBinario.Click
        Dim Val As String = Nothing
        Dim Resultado As New System.Text.StringBuilder

        For Each Character As Byte In System.Text.ASCIIEncoding.ASCII.GetBytes(TextBox1.Text)
            Resultado.Append(Convert.ToString(Character, 2).PadLeft(8, "0"))
            Resultado.Append("")
        Next

        Val = Resultado.ToString.Substring(0, Resultado.ToString.Length - 1)
        TextBox2.Text = Val

    End Sub

sábado, 6 de octubre de 2012

Llenar combobox con campos concatenados de una base de datos en C#

En este ejemplo utilizare la Base de Datos Northwind y concatenare los campos Nombre de Contacto y Compañia en un combobox.
El codigo es el siguiente:

public void llenarProfesor()
        {
            string enlace="Data Source=XSaint;Database=Northwind;Integrated Security=SSPI";
            string conect;            
            //enlace con la base de datos
            SqlConnection conexion = new SqlConnection();
            conexion.ConnectionString = enlace;
            conect = conexion.ConnectionString;
            //se declara el DataSet
            DataSet ds3 = new DataSet();
            //se indica la consulta e sql donde se elige el ID_Profesor
            //y se concatenan los campos Nombre y Apellido_P
            //en una variable llamada Name_Full
            SqlDataAdapter da3 = new SqlDataAdapter("Select CustomerID,(ContactName + \' \' + CompanyName) as Name_Full FROM Customers", conect);
            //se especifica la tabla
            da3.Fill(ds3, "Customers");
            comboBox1.DataSource = ds3.Tables[0].DefaultView;
            //el valor real será el ID_Profesor
            comboBox1.ValueMember = "CustomerID";
            //lo que mostrará sera la variable Name_Full la cual tiene concatenados los campos Nombre y Apellido_P
            comboBox1.DisplayMember = "Name_Full";
        }
        private void Form1_Load(object sender, EventArgs e)
        {
            llenarProfesor();
        }

Como poner letra capital de todas las palabras de un string en C#

A menudo necesitamos capitalizar la primera letra de algunas palabras o algun texto(por ejemplo cuando queremos mostrar nombres completos de personas o ciudades, nombres, etcetera).
Como la clase string no tiene un metodo para hacer esto nosotros podemos pensar que no hay una solucion built-in en C# para este problema.
Bueno en realidad hay 2 formas de hacer esto:
Para este proyecto agregaremos 2 textbox y un boton:
Solucion 1
public static string Capitalize(string value)
        {
            return System.Globalization.CultureInfo.CurrentCulture.TextInfo.ToTitleCase(value);
        }

        private void button1_Click(object sender, EventArgs e)
        {
            textBox2.Text = Capitalize(textBox1.Text);            
        }

public static string CapitalizeWords(string value)
        {
            if (value == null)
                throw new ArgumentNullException("value");
            if (value.Length == 0)
                return value;

            StringBuilder result = new StringBuilder(value);
            result[0] = char.ToUpper(result[0]);
            for (int i = 1; i < result.Length; ++i)
            {
                if (char.IsWhiteSpace(result[i - 1]))
                    result[i] = char.ToUpper(result[i]);
            }
            return result.ToString();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            textBox2.Text = CapitalizeWords(textBox1.Text);            
        }

Usando Regex matches para comprobar si un String es alphanumerico en C#

El metodo regex.match de C# es tipicamente usado para validar un string o para asegurar que un string esta conformado de un patron particular sin necesidad de manipularlo. Abajo utilizo un metodo de extension de strings que usa regex matches en C# para comprobar si el string es alphanumerico. Retornara verdadero si el string dado contiene solo numeros y letras del alfabeto.
using System.Text.RegularExpressions;
namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        public static class CheckString
        {
            public static bool IsAlphanumeric(string source)
            {
                Regex pattern = new Regex("[^0-9a-zA-Z]");
                return !pattern.IsMatch(source);
            }
        }

        private void button1_Click(object sender, EventArgs e)
        {
            string testString = textBox1.Text;

            if (CheckString.IsAlphanumeric(testString))
                textBox2.Text="Yes string is Alphanumeric!";
            else
                textBox2.Text="No string is not Alphanumeric!";

            
        }

viernes, 5 de octubre de 2012

AutoCompletar TextBox desde base de datos con Northwind y VB.NET

Hay que tener en cuenta que para utilizar esta opción, debes asignar las siguientes propiedades:
AutoCompleteMode: que sirve para indicar cómo queremos que se muestren los datos que encuentra mientras se escribe en el control.
AutoCompleteSource: que sirve para indicarle de dónde se obtendrán los datos que se usarán mientras se escribe.
En este ejemplo se utiliza AutoCompleteSource asignado a CustomSource debido a que la fuente de datos la obtenemos desde una ruta personalizada.
En el evento Load del formulario, se llama a la función AutoCompletar como se muestra debajo, asignándole el control TextBox.
Imports System.Data.SqlClient
Public Class Form1

    Dim myCommand As SqlCommand
    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        AutoCompletar(Me.TextBox1)
        Me.ActiveControl = TextBox1
    End Sub
Esta es la función AutoCompletar que se deberá utilizar asignándole el control TextBox.
Public Function AutoCompletar(ByVal Control As TextBox) As AutoCompleteStringCollection
        Dim Coleccion As New AutoCompleteStringCollection
        Dim Comando, Coneccion As String
        'Dim myConnection As SqlConnection
        Comando = "select LastName from Employees"
        'Creamos una nueva cadena de coneccion 
        Coneccion = "Data Source=XSaint;Initial Catalog=Northwind;Integrated Security=SSPI"
        'myConnection = New SqlConnection(Coneccion)
        Using myConnection As New SqlConnection(Coneccion)
            Dim Ejecutar As New SqlClient.SqlCommand(Comando, myConnection)
            'Abrimos la coneccion
            myConnection.Open()
            Dim Lector As SqlDataReader = Ejecutar.ExecuteReader()
            ' Realizamos un Loop mientras se est‚ leyendo.
            While Lector.Read()
                Coleccion.AddRange(New String() {Lector(0)})
            End While
            'Cerramos el SqlReader
            Lector.Close()
            'Cerramos la coneccion
            myConnection.Close()
        End Using
        'Ajustamos el control TextBox o ComboBox para recibir los datos de la siguiente manera.
        With Control
            .AutoCompleteMode = AutoCompleteMode.Suggest
            .AutoCompleteSource = AutoCompleteSource.CustomSource
            .AutoCompleteCustomSource = Coleccion
        End With
        'Devolvemos los datos recuperados de la base de datos
        Return Coleccion
    End Function
End Class

Eliminar duplicados de un listbox en VB.NET

Simple función en vb.net que recorre todos los elementos de la lista de un
combo o listbox para poder eliminar los elementos o items duplicados
El ejemplo comienza comparando desde el primer item con todos los demás
empezando desde abajo hacia arriba. Si el elemento es el mismo lo elimina con el
método RemoveAt del ListBox indicando el índice
Colocar en el formulario
  1. Un control ListBox llamado Listbox1
  2. Un control Button llamado Button1

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        With ListBox1.Items
            .Add("1")
            .Add("2")
            .Add("3")
            .Add("1")
            .Add("2")
            .Add("3")
            ListBox1.SelectedIndex = 0
        End With
        Button1.Text = "Eliminar duplicados "
    End Sub
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        MsgBox(Eliminar(ListBox1), MsgBoxStyle.Information, "Elementos duplicados en el List ")
    End Sub
    Function Eliminar(ByVal LB As ListBox) As Int32
        Dim i As Int32
        Dim j As Int32
        Dim n As Int32           ' Recorre los items ( compara empezando desde el primero , de abajo hacia arriba)         
        For i = 0 To LB.Items.Count - 2
            For j = LB.Items.Count - 1 To i + 1 Step -1                 ' ... si es el mismo                 
                If LB.Items(i).ToString = LB.Items(j).ToString Then
                    LB.Items.RemoveAt(j) ' elimina el elemento indicando el índice                     
                    n += 1 'lleva la cuenta de los duplicados                 
                End If
            Next
        Next
        Return n ' retorna los eliminados     End Function End Class 
    End Function

sábado, 29 de septiembre de 2012

Como ver imagen previa antes de guardarlo en Base de Datos en ASP.NET

Para este ejemplo agregamos un control tipo FileUpload, un boton de vista previa que al pulsarlo nos muestre la imagen y un textbox que extraera el nombre de la imagen
Este sera el codigo .aspx
<body>
    <form id="form1" runat="server">
    <div>
    
        <asp:FileUpload ID="FileUpload1" runat="server" />
        <asp:Button ID="Button1" runat="server" onclick="Button1_Click" 
            Text="Vista Previa" />
        <br />
        <asp:Button ID="Button2" runat="server" Text="Nombre de Archivo" />
        <asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>
        <asp:Image ID="Image1" runat="server" />
    </div>
    </form>
</body>
Y este codigo sera del lado del servidor
Code Behind :
string imgname;
    protected void Page_Load(object sender, EventArgs e)
    {

    }
    protected void Button1_Click(object sender, EventArgs e)
    {
        string L_path = "No Images";
        imgname = FileUpload1.FileName;
        TextBox1.Text = imgname;

        // break the pathe, collect file type then match.
        string filetype;
        filetype = System.IO.Path.GetExtension(FileUpload1.PostedFile.FileName);
        if (filetype.ToLower().Contains(".jpg")  ||  filetype.ToLower().Contains(".jpeg") || filetype.ToLower().Contains(".bmp") || filetype.ToLower().Contains(".png"))
        {

            ClientScript.RegisterStartupScript(typeof(string), "You choosen the file in wrong formated.. !!!", "");

        }
        if (FileUpload1.PostedFile.ContentLength > 5242880) // byte size
        {
            Page.ClientScript.RegisterStartupScript(Type.GetType("System.String"), "addScript", "alert('Image Size is should be Less Than 5 MB' )", true);

        }
        if (FileUpload1.HasFile)
        {
            L_path = Server.MapPath("~/Images/").ToString();
            L_path += imgname;
            FileUpload1.SaveAs(L_path); // Temporary saved 

        }
        else
        {
            Page.ClientScript.RegisterStartupScript(Type.GetType("System.String"), "addScript", "alert('No Image is Selected..)", true);

        }
        Image1.ImageUrl = "~/Images/" + imgname;

        Page.ClientScript.RegisterStartupScript(Type.GetType("System.String"), "addScript", "alert('Image is Reflected..Plz Save it)", true);

        // After saving into Database delete current file from Application.
    }

sábado, 22 de septiembre de 2012

Generar passwords aleatorios en ASP.NET

En este ejemplo generaremos una clave aleatoria ingresando la longitud de la misma en el textbox y dando click en el boton se mostrara en el label:
En el lado del cliente agregamos este codigo(Default.aspx)
<form id=”form1″ runat=”server”>
<div>
<asp:TextBox ID=”TextBox1″ runat=”server”></asp:TextBox>
<asp:Button ID=”rndpwd” runat=”server” Text=”Generate Pwd” onclick=”rndpwd_Click” />
<br />
<asp:Label ID=”Label1″ runat=”server” Text=”Label”></asp:Label>
</div>
</form>
Ahora creamos una clase en el app_code y escribimos este metodo ahi:
public static string GetRandomPassword(int length)
    {
        char[] chars = "$%#@!*abcdefghijklmnopqrstuvwxyz1234567890?;:ABCDEFGHIJKLMNOPQRSTUVWXYZ^&".ToCharArray();
        string password = string.Empty;
        Random random = new Random();

        for (int i = 0; i < length; i++)
        {
            int x = random.Next(1,chars.Length);
            //Don't Allow Repetation of Characters
            if (!password.Contains(chars.GetValue(x).ToString()))
                password += chars.GetValue(x);
            else
                i--;
        }
        return password;
    }
Llamamos esta pagina en el lado del servidor utilizando el evento click del boton de la siguiente manera:
protected void rndpwd_Click(object sender, EventArgs e)
    {
        Label1.Text = PasswordGeneration.GetRandomPassword(Convert.ToInt32(TextBox1.Text));
    }
y listo ejecuten el codigo ingresan un numero y les saldra un password de esa longitud

Como encriptar y desencriptar parametros Query Strings en ASP.NET

Los query strings son un modo facil de pasar informacion de una pagina a otra. El problema con los query strings es que la informacion es visible en la URL. Y muchas veces se ha pasado por alto este detalle y hay veces que necesitamos encriptar cierta informacion para evitar ataques tipo SQL Injection.En el siguiente ejemplo ingresaremos una cadena y mostraremos la misma encriptada en la Barra de Direcciones.
Creamos un sitio wseb y agregamos otro webform aparte del que nos viene por defecto:
En nuestra primera pagina agregamos un textbox y un boton
<body>
    <form id="form1" runat="server">
<div>
        <asp:TextBox ID="txt1" runat="server"></asp:TextBox>
        <asp:Button ID="btn1" runat="server" Text="Button" onclick="btn1_Click" />         
    </div>
    </form>
</body>
escribiremos codigo en el evento Click del boton y declaramos una variable global de tipo string:
string encodedString;//Declare this is in  Global 
    protected void btn1_Click(object sender, EventArgs e)
    {        
        string str = txt1.Text;      
        encodedString = (Convert.ToBase64String(System.Text.ASCIIEncoding.ASCII.GetBytes(str)));      
        Response.Redirect("~/Default2.aspx?str=" + encodedString);    
    }
Este codigo ira en la primera pagina que nos pedira ingresar un texto en el textbox y nos mostrara en la 2 pagina el mismo texto pero en la cadena saldra encriptado como en la foto del principio. Ahora en la 2 pagina agregamos un label este sera el codigo en html:
<div>
        <asp:Label ID="Label1" runat="server" Text="Label"></asp:Label>
    </div>
Y este es el codigo en C#:
string decodedString;//Declare this is in  Global
    protected void Page_Load(object sender, EventArgs e)
    {
        decodedString = System.Text.ASCIIEncoding.ASCII.GetString(Convert.FromBase64String(Request.QueryString["str"]));
        Label1.Text = decodedString; 
    }
Este pequeño codigo fue un ejemplo de encriptacion basica espero les haya sido util.

domingo, 9 de septiembre de 2012

JQuery UI Ajax Autocompletar TextBox con Base de Datos en ASP.NET usando WebService

Para lograr esto utilize la base de datos AdventureWorks y la tabla Person.Contact, bueno mas abajo veran esta conexion, lo primero que haremos sera crear un proyecto web en C# y agregan este codigo en la hoja de codigo de la parte html:

<%@ Page Language="C#" AutoEventWireup="true"  CodeFile="Default.aspx.cs" Inherits="_Default" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title>Página sin título</title>
    <link href="http://ajax.googleapis.com/ajax/libs/jqueryui/1.8.1/themes/base/jquery-ui.css" rel="stylesheet" type="text/css"/>
    <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js"></script>
    <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jqueryui/1.8.1/jquery-ui.min.js"></script> 
                <script type="text/javascript">
                    $(document).ready(function() {
                        SearchText();
                    });
                    function SearchText() {
                        $(".auto").autocomplete({
                            source: function(request, response) {
                                $.ajax({
                                    type: "POST",
                                    contentType: "application/json; charset=utf-8",
                                    url: "Default.aspx/GetAutoCompleteData",
                                    data: "{'FirstName':'" + document.getElementById('FirstName').value + "'}",
                                    dataType: "json",
                                    success: function(data) {
                                        response(data.d);
                                    },
                                    error: function(result) {
                                        alert("Error Occurred");
                                    }
                                });
                            }
                        });
                    }
                </script>
</head>
<body>
    <form id="form1" runat="server">
   <div class="demo">
<div class="ui-widget">
    <label for="tbAuto">Ingrese un nombre: </label>
   <input type="text" id="FirstName" class="auto" />
</div></div>
    </form>
</body>
</html>
Mas o menos se vera asi:
Como ven en el codigo de la cabecera de arriba agregue algunos scripts y archivos CSS esto para tener la opcion de mostrar el autocompletado con estilo css. Para conseguir estos archivos agreguen estas URLS a su aplicacion.
Otra cosa que necesitamos saber es la funcion script en la seccion header.
$(".auto").autocomplete({
                            source: function(request, response) {
                                $.ajax({
                                    type: "POST",
                                    contentType: "application/json; charset=utf-8",
                                    url: "Default.aspx/GetAutoCompleteData",
                                    data: "{'FirstName':'" + document.getElementById('FirstName').value + "'}",
                                    dataType: "json",
                                    success: function(data) {
                                        response(data.d);
                                    },
                                    error: function(result) {
                                        alert("Error Occurred");
                                    }
                                });
                            }
                        });
Esta declaracion de la funcion de formato JSON que estamos usando es para llamar a los metodos web usando JQuery $.ajax() cuando queramos llamar a Ajax con JQuery usaremos funciones JSON con el formato de arriba.
Los atributos ContentType y dataType son los mismos para todas las funciones solo url, data y success function variaran basadas en nuestra peticion.
url: Esta es la ruta para nuestros metodos Web
data: Pasaremos parametros utilizando este parametro sino pasamos ninguno entonces en data pondremos: "{}".
Hay un detalle JSON es sensible a mayusculas asi que sean cuidadosis antes de escribir el formato de data JSON.
Ahora abran la hoja de codigo y agreguen los siguientes namespaces:
using System.Collections.Generic;
using System.Data.SqlClient;
using System.Web.Services;
Luego agregan el siguiente codigo en C#
[WebMethod]

    public static List GetAutoCompleteData(string FirstName)
    {
        List result = new List();
        using (SqlConnection con = new SqlConnection("Data Source=XSaint;Integrated Security=true;Initial Catalog=AdventureWorks"))
        {
            using (SqlCommand cmd = new SqlCommand("select distinct FirstName from Person.Contact where FirstName LIKE '%'+@FirstName+'%'", con))
            {
                con.Open();
                cmd.Parameters.AddWithValue("@FirstName", FirstName);
                SqlDataReader dr = cmd.ExecuteReader();
                while (dr.Read())
                {
                    result.Add(dr["FirstName"].ToString());
                }
                return result;
            }
        }
    } 
Luego presionen F5 y el resultado sera asi:

Mostrar un archivo Excel 2003, 2007 en GridView en ASP.NET 2008 con OleDbDataAdapter

He visto muchos ejemplos de como hacer esto pero algunos no funcionan jeje asi que aqui comparto este codigo que si funciona ya sea el archivo excel en diferentes versiones 1997, 2003 o 2007. Lo primero que haremos sera pulsar el boton examinar, buscamos el archivo excel luego lo copiaremos ese archivo al directorio web y de alli crearemos el enlace de la hoja de excel al gridview.
Lo primero sera crear un proyecto web y agregar un scriptmanager, un uploadpanel y dentro de el al gridview para refrescar esa parte y no toda la pagina, tambien agregamos un control FileUpload, un boton y un Label debajo. Estos 3 ultimos controles podemos ponerlos dentro de una tabla y los 2 primeros dentro del grid, personalizando al gridview para darle mayor vistocidad lucira asi:
el codigo que tendra nuestro body sera mas o menos el siguiente:
<body>
    <form id="form1" runat="server">
    <div>
<asp:ScriptManager ID="ScriptManager1" runat="server">
</asp:ScriptManager>
<asp:UpdatePanel ID="UpdatePanel1" runat="server">
<ContentTemplate>
<asp:GridView ID="GridView1" runat="server" CellPadding="4"
Font-Names="Verdana" Font-Size="Small" ForeColor="#333333">
<RowStyle BackColor="#EFF3FB" />
<FooterStyle BackColor="#507CD1" Font-Bold="True" ForeColor="White" />
<PagerStyle BackColor="#2461BF" ForeColor="White" HorizontalAlign="Center" />
<SelectedRowStyle BackColor="#D1DDF1" Font-Bold="True" ForeColor="#333333" />
<HeaderStyle BackColor="#507CD1" Font-Bold="True" ForeColor="White" />
<EditRowStyle BackColor="#2461BF" />
<AlternatingRowStyle BackColor="White" />
</asp:GridView>
</ContentTemplate>
</asp:UpdatePanel>
<table>
<tr>
<td><asp:FileUpload ID="fupExcel" runat="server" Font-Names="Verdana"
Font-Size="Small" /></td>
</tr>
<tr>
<td><asp:Button ID="btnUpload" runat="server" Text="Upload" Font-Names="Verdana"
Font-Size="Small" onclick="btnUpload_Click" /></td>
</tr>
<tr>
<td>
    <asp:Label ID="Label1" runat="server"></asp:Label>
    </td>
</tr>
</table>
</div>
    </form>
</body>
para nuestro codigo importamos las siguientes librerias:
using System.Data.OleDb;
using System.IO;
olvide decirles antes de escribir el codigo de abajo para subir el excel, creen una carpeta llamada Invoices dentro de su proyecto, en la misma ruta donde esta su web default1.aspx ya que esta carpeta es la que nos servira para crear el enlace. Una vez dicho esto escriban este codigo dentro del evento click del boton Upload.
if (fupExcel.HasFile)
        {
            try
            {
                HttpFileCollection uploads = HttpContext.Current.Request.Files;
                for (int i = 0; i < uploads.Count; i++)
                {
                    HttpPostedFile upload = uploads[i];
                    if (upload.ContentLength == 0)
                        continue;
                    string c = System.IO.Path.GetFileName(upload.FileName);
                    try
                    {
                        upload.SaveAs(Server.MapPath("Invoices\\") + c);
                    }
                    catch (Exception Exp)
                    {
                        throw (Exp);
                    }
                }
                if (fupExcel.PostedFile != null)
                {
                    HttpPostedFile attFile = fupExcel.PostedFile;
                    int attachFileLength = attFile.ContentLength;
                    if (attachFileLength > 0)
                    {
                        if (fupExcel.PostedFile.ContentLength > 0)
                        {
                            string Extension = Path.GetExtension(fupExcel.PostedFile.FileName);
                            string inFileName = Path.GetFileName(fupExcel.PostedFile.FileName);
                            string pathDataSource = Server.MapPath("Invoices\\") + inFileName;

                            string conStr = "";
                            if (Extension == ".xls" || Extension == ".xlsx")
                            {
                                switch (Extension)
                                {
                                    case ".xls": //Excel 1997-2003
                                        conStr = "Provider=Microsoft.Jet.OLEDB.4.0;" + "Data Source='" + pathDataSource.ToString() + "';" + "Extended Properties=Excel 8.0;";
                                        break;
                                    case ".xlsx": //Excel 2007
                                        conStr = "Provider=Microsoft.ACE.OLEDB.12.0;" + "Data Source='" + fupExcel.PostedFile.FileName.ToString() + "';" + "Extended Properties=Excel 8.0;";
                                        break;
                                    default:
                                        break;
                                }

                                OleDbConnection connExcel = new OleDbConnection(conStr.ToString());
                                OleDbCommand cmdExcel = new OleDbCommand();
                                OleDbDataAdapter oda = new OleDbDataAdapter();
                                DataTable dt = new DataTable();
                                connExcel.Open();
                                DataSet ds = new DataSet();
                                //Selecting Values from the first sheet
                                //Sheet name must be as Sheet1
                                OleDbDataAdapter da = new OleDbDataAdapter("SELECT * FROM [Members$]", conStr.ToString());
                                da.Fill(ds);
                                GridView1.DataSource = ds;
                                GridView1.DataBind();
                                if (GridView1.Columns.Count > 0)
                                {
                                }
                                connExcel.Close();
                                if (File.Exists(pathDataSource))
                                {
                                    File.Delete(pathDataSource);
                                }
                            }
                            else
                            {
                                //Show your error in any error controls
                            }
                        }
                        else
                        {
                            fupExcel.Focus();
                            GridView1.DataSource = null;
                            GridView1.DataBind();
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        else
            Label1.Text = "Seleccione un archivo";
la variable fupexcel es el control FileUpload que les mencione en un principio. El primer if es para el caso que se presione el boton Upload sin haber seleccionado el archivo Excel. Presionen F5 y les saldra asi:

sábado, 8 de septiembre de 2012

DropDownList para mostrar Pais, Estados y ciudades en ASP.NET

En este post mostrare como crear 3 DropDownList para mostrar Paises, estados y ciudades. Cuando usted seleccione un pais automaticamente mostrara los nombres de estados de esa ciudad en el siguiente DropDownList. Luego cuando selecciones un estado, el dropdownlist de ciudades mostrara las ciudades relacionadas a ese estado.
Primero creamos una BD de ejemplo
create database ABC
ahora en esta base ejecutamos estas consultas para crear las tablas Pais, estados y ciudades, y luego las poblamos con datos:
Create Table Country
(
CountryId Int Primary Key,
County Varchar(30)
)
Create Table countryState
(
StateId Int Primary Key,
CountryId Int Foreign Key References Country(CountryId),
State Varchar(30)
)
Create Table stateCity
(
CityId Int,
StateId Int Foreign Key References countryState(StateId),
City Varchar(30)
)
Insert Into Country Values(101,'India')
Insert Into Country Values(102,'USA')
Insert Into Country Values(103,'Pakistan')
 
Insert Into countryState Values(1001,101,'U.P')
Insert Into countryState Values(1002,101,'Kerala')
Insert Into countryState Values(1003,101,'Kasmir')
Insert Into countryState Values(2001,102,'Colorado')
Insert Into countryState Values(2002,102,'Delaware')
Insert Into countryState Values(2003,102,'Georgia')
Insert Into countryState Values(3001,103,'Punjap')
Insert Into countryState Values(3002,103,'Baluchistan')
Insert Into countryState Values(3003,103,'Sind')
 
Insert Into stateCity Values(11,1001,'Kanpur')
Insert Into stateCity Values(12,1001,'Dg')
Insert Into stateCity Values(21,1002,'Pal')
Insert Into stateCity Values(22,1002,'Tri')
Insert Into stateCity Values(31,1003,'Jammu')
Insert Into stateCity Values(32,1003,'Manali')
Insert Into stateCity Values(41,2001,'Alabama')
Insert Into stateCity Values(42,2001,'Arizona')
Insert Into stateCity Values(51,2002,'Bellefonte')
Insert Into stateCity Values(52,2002,'Felton')
Insert Into stateCity Values(61,2003,'Rustavi')
Insert Into stateCity Values(62,2003,'Kobulati')
Insert Into stateCity Values(71,3001,'Lahore')
Insert Into stateCity Values(72,3001,'Faisalabad')
Insert Into stateCity Values(81,3002,'Quetta')
Insert Into stateCity Values(82,3002,'Nasirabad')
Insert Into stateCity Values(91,3003,'Krachi')
Insert Into stateCity Values(92,3003,'Mirpur khas')
Ahora comprobamos si lleno correctamente:
en la tabla Country
en la tabla CountryState
En la tabla StateCity
Ahora agregamos 3 DropDownList al proyecto de la siguiente forma:
Ahora creamos un proyecto web, arriba del div agregamos un scripttmanager y dentro del div vamos a insertar 3 updatepanel(los update panel realizan peticiones asíncronas al servidor y refrescan su contenido sin tener que hacer un PostBack de la página entera, solo de esta parte) y dentro de cada uno agregamos 3 dropdownlist para listar los paises, estados y ciudades mas o menos se vera asi:
ahora a cada UpdatePanel en su propiedad Triggers lo enlazamos con el Dropdownlist:
en cada dropdownlist las propiedades autopostback y appendDataBoundItems las ponen en True. mas o menos el body de la pagina se vera asi:

    
Seleccione un Pais Seleccione un Estado Seleccione una Ciudad
ahora en el codigo de la pagina 3 procedimientos que llenaran los dropdown en funcion al 1. lo primero que haremos sera copiar este codigo
private SqlConnection conn = new SqlConnection("Data source=XSaint; database=ABC; Integrated Security=true");

        public void Bind_Pais()
        {
            conn.Open();
            SqlCommand cmd = new SqlCommand("select County,CountryId from Country", conn);
            SqlDataReader dr = cmd.ExecuteReader();
            DropDownList1.DataSource = dr;
            DropDownList1.Items.Clear();
            DropDownList1.Items.Add("--Por favor seleccione Pais--");
            DropDownList1.DataTextField = "County";
            DropDownList1.DataValueField = "CountryId";
            DropDownList1.DataBind();
            conn.Close();
        }

        public void Bind_Estado()
        {
            conn.Open();
            SqlCommand cmd = new SqlCommand("select State,StateID from countryState where CountryId='" + DropDownList1.SelectedValue + "'", conn);
            SqlDataReader dr = cmd.ExecuteReader();
            DropDownList2.DataSource = dr;
            DropDownList2.Items.Clear();
            DropDownList2.Items.Add("--Por favor seleccione Estado--");
            DropDownList2.DataTextField = "State";
            DropDownList2.DataValueField = "StateID";
            DropDownList2.DataBind();
            conn.Close();   
        }

        public void Bind_Ciudad()
        {
            conn.Open();
            SqlCommand cmd = new SqlCommand("select * from stateCity where StateId ='" + DropDownList2.SelectedValue + "'", conn);
            SqlDataReader dr = cmd.ExecuteReader();
            DropDownList3.DataSource = dr;
            DropDownList3.Items.Clear();
            DropDownList3.Items.Add("--Please Select city--");
            DropDownList3.DataTextField = "City";
            DropDownList3.DataValueField = "CityID";
            DropDownList3.DataBind();
            conn.Close();
        }
en el load de la pagina escribimos este codigo:
if (!IsPostBack)
            {
                Bind_ddlCountry();
            }
en el evento SelectedIndexChanged del primer DropDownList enlazamos con el evento que cargara el 2 dropdownlist
protected void  DropDownList1_SelectedIndexChanged(object sender, EventArgs e)
    {
        Bind_Estado();
    }
lo mismo haremos en el evento SelectedIndexChanged del segundo DropDownList para mostrar las ciudades pertenecientes al estado elegido:
protected void DropDownList2_SelectedIndexChanged(object sender, EventArgs e)
    {
        Bind_Ciudad();
    }
y deberia salirles asi: