31 de enero de 2012

Autocomplete textbox C#

Creamos un nuevo proyecto en C# 


luego agregamos un textbox al formulario


y modificamos las propiedades siguientes del textbox partiendo de esto:


y las dejamos así:


igualmente esto podemos especificarlo en el código, por lo que no es estrictamente necesario cambiar las propiedades del textbox pero igual es bueno saberlo(digo yo), en este caso, la propiedad AutoCompleteMode establece el “efecto visual” que tendrá nuestro autocomplete, sus valores pueden ser: 

Append: Autocompleta en la misma linea mediante se va escribiendo 
None: sin autocompletar
Suggest: ofrece las opciones en una lista desplegable abajo del textbox.
SuggestAppend: une la lista con el autocompletado en el textbox

luego en el AutoCompleteSource se especifica el CustomSource ya que seremos nosotros quienes especificaremos el origen de datos que utilizara el textbox.


Opción 1: Utilizando SqlDataReader

Aqui se especifican las propiedades del textbox desde la ventana de propiedades, tal como se describió anteriormente, por lo que para funcionar deben quedar estas propiedades como esta la imagen.

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Data.SqlClient;

namespace Autocommplete_C
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        SqlConnection cnn;
        SqlCommand cmd;
        SqlDataReader reader;
        private void Form1_Load(object sender, EventArgs e)
        {

            using (cnn = new SqlConnection(@"Data Source=.\SQLEXPRESS;Integrated Security=SSPI;Initial Catalog=imagenes"))
            {
                using (cmd = new SqlCommand("select nombre from img", cnn))
                {
                    cnn.Open();
                    reader = cmd.ExecuteReader();
                    while (reader.Read())
                    {
                        this.textBox1.AutoCompleteCustomSource.Add(reader[0].ToString());
                    }
                    reader.Close();
                    cnn.Close();
                }
            }
        }
    }
}


Opción 2: Utilizando SqlDataReader

Aquí se especifican las propiedades desde el código, se puede utilizar cualquier opción no hay mas diferencia entre estas., aunque siempre lo mejor es tenerlo todo especificado en el código.

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Data.SqlClient;

namespace Autocommplete_C
{
    public partial class Form2 : Form
    {
        public Form2()
        {
            InitializeComponent();
        }
        private SqlConnection cnn;
        private SqlDataAdapter da;
        private DataTable dt;
        private string sql = "select nombre from img";

        private void Form2_Load(object sender, EventArgs e)
        {
            using (cnn = new SqlConnection(@"Data Source=.\SQLEXPRESS;Integrated Security=SSPI;Initial Catalog=imagenes"))
            {
                using (da = new SqlDataAdapter(sql, cnn))
                {
                    dt=new DataTable();
                    da.Fill(dt);

                    this.textBox1.AutoCompleteSource = AutoCompleteSource.CustomSource;
                    this.textBox1.AutoCompleteMode = AutoCompleteMode.SuggestAppend;
                    foreach (DataRow dr in dt.Rows)
                    {
                        this.textBox1.AutoCompleteCustomSource.Add(dr[0].ToString());
                    }

                }
            }
        }
    }
}
   


Compilamos, ejecutamos y ya esta.


Autocomplete textbox VB

Crear un nuevo proyecto en Visual Basic


y diseñar el form tal como esta en la figura: 


dentro de las propiedades del textbox prestar atención a estas en particular:


las cuales deberán ser cambiadas de la siguiente manera:


igualmente esto podemos especificarlo en el código, por lo que no es estrictamente necesario cambiar las propiedades del textbox pero igual es bueno saberlo(digo yo), en este caso, la propiedad AutoCompleteMode establece el “efecto visual” que tendrá nuestro autocomplete, sus valores pueden ser: 

Append: Autocompleta en la misma linea mediante se va escribiendo 
None: sin autocompletar
Suggest: ofrece las opciones en una lista desplegable abajo del textbox.
SuggestAppend: une la lista con el autocompletado en el textbox

luego en el AutoCompleteSource se especifica el CustomSource ya que seremos nosotros quienes especificaremos el origen de datos que utilizara el textbox.

Opción 1: Usando SqlDataReader

Imports System.Data
Imports System.Data.SqlClient
Public Class Form1
    Dim cnn As New SqlConnection("Data Source=.\SQLEXPRESS;Integrated Security=SSPI;Initial Catalog=imagenes")
    Dim cmd As SqlCommand
    Dim reader As SqlDataReader

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Using cmd = New SqlCommand("select nombre from img", cnn)
            cnn.Open()
            reader = cmd.ExecuteReader()
            While reader.Read()
                Me.TextBox1.AutoCompleteCustomSource.Add(reader(0).ToString)
            End While
            reader.Close()
        End Using
    End Sub
End Class


 Opción 2: Usando SqlDataAdapter y DataTable

en esta opcion aprovecho para mostrar como modificar las propiedades AutoCompleteSource y AutoCompleteMode desde el código, sin necesidad de modificar en la ventana propiedades del textbox, esto es solo para conocimiento general, cualquier opción es valida.

Imports System.Data
Imports System.Data.SqlClient
Public Class Form2
    Dim cnn As New SqlConnection("Data Source=.\SQLEXPRESS;Integrated Security=SSPI;Initial Catalog=imagenes")
    Dim da As SqlDataAdapter
    Dim dt As DataTable
    Dim sql As String = "select * from img"

    Private Sub Form2_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Using da = New SqlDataAdapter(sql, cnn)
            dt = New DataTable()
            da.Fill(dt)
            Me.TextBox1.AutoCompleteSource = AutoCompleteSource.CustomSource
            Me.TextBox1.AutoCompleteMode = AutoCompleteMode.SuggestAppend
            Dim dr As DataRow
            For Each dr In dt.Rows
                Me.TextBox1.AutoCompleteCustomSource.Add(dr(0).ToString)
            Next
        End Using
    End Sub

End Class



Compilamos, ejecutamos y ya esta.

30 de enero de 2012

DGV - C#

se cargara el formulario con los datos, se podrá insertar, modificar y eliminar registros a una base de datos en SQL Express utilizando C# con Visual Studio 2010, asi que para empezar utilizamos el SQL Server Management Studio 2008, abrimos y luego click derecho en databases y seleccionar new database



se crea una base de datos a la cual se va acceder, en este ejemplo se llamara empleado y a la vez se creara una tabla para guardar los datos, así que en la nueva base de datos creada, extender el contenido y click derecho en tables, luego seleccionar new Table...


aquí están los campos de la tabla y el nombre que utilizare, se llamara datos y tendrá cuatro campos, luego presionamos OK para guardar y abrimos el Visual Studio, en mi caso utilizo el VS 2010.


Creamos un nuevo proyecto en C# para empezar a trabajar sobre el, en este ejemplo el nombre que le puse fue C - SQL


lo primero va ser crear un nuevo archivo app.config para recuperar la cadena de conexion para conectarse a la base de datos, para eso click derecho en el proyecto que se acaba de crear y seleccionar properties.


luego en settings cambiamos los valores de Name y Type tal como aparecen en la imagen, en el caso de Scope, este cambia automáticamente al cambiar el Type y el value debe buscarse, para eso se da click en el botón al final, el que tiene los tres puntos, luego en la pantalla que te aparecerá buscas tu servidor de base de datos y tu base.




ahora que se tiene la conexión se deberá añadir la referencia System.Configuration, para eso click derecho en  el proyecto dentro del Solution Explorer y seleccionar Add Reference 



Ahora creamos una nueva clase en el proyecto donde se realizaran las operaciones importantes del proyecto, para este caso se llamara ACME


y dentro de esta clase se deberán añadir estas referencias:

using System.Data.SqlClient;
using System.Configuration;
using System.Windows.Forms;
using System.Data;

  
y luego copiar este código:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.SqlClient;
using System.Configuration;
using System.Windows.Forms;
using System.Data;

namespace C___SQL
{
    class ACME
    {
        SqlDataAdapter da;
        DataTable dt;
        SqlConnection cnn;
        SqlCommand cmd;
        string conex = ConfigurationManager.ConnectionStrings["con"].ConnectionString;
        string select = "select * from datos";

        public DataTable cargarDatos()
        {
            using (cnn = new SqlConnection(conex))
            {
                cnn.Open();
                da = new SqlDataAdapter(select, conex);
                dt = new DataTable();
                da.Fill(dt);
                return dt;
            }
        }

        public void InsertarDatos(string val1, string val2, string val3)
        {
            using (cnn = new SqlConnection(conex))
            {
                cnn.Open();
                cmd = new SqlCommand();
                cmd.Connection = cnn;
                cmd.CommandText = "insert into datos values(@nombre, @cargo, @dpto)";
                cmd.Parameters.AddWithValue("@nombre", val1);
                cmd.Parameters.AddWithValue("@cargo", val2);
                cmd.Parameters.AddWithValue("@dpto", val3);
                cmd.ExecuteNonQuery();
                MessageBox.Show("Datos ingresados correctamente");
                cmd.Dispose();   
            }
        }

        public void ModificarDatos(string val1, string val2, string val3, string val4)
        {
            using (cnn = new SqlConnection(conex))
            {
                cnn.Open();
                cmd = new SqlCommand();
                cmd.Connection = cnn;
                cmd.CommandText = "update datos set nombre=@nombre, cargo=@cargo, departamento=@departamento where id=@id";
                cmd.Parameters.AddWithValue("@nombre", val1);
                cmd.Parameters.AddWithValue("@cargo", val2);
                cmd.Parameters.AddWithValue("@departamento", val3);
                cmd.Parameters.AddWithValue("@id", val4);
                cmd.ExecuteNonQuery();
                cmd.Dispose();
                MessageBox.Show("datos modificados exitosamente");
            }
       
        }

        public void eliminardatos(string val1)
        {
            using (cnn = new SqlConnection(conex))
            {
                cnn.Open();
                cmd = new SqlCommand();
                cmd.Connection = cnn;
                cmd.CommandText = "delete from datos where id=@id";
                cmd.Parameters.AddWithValue("@id", val1);
                cmd.ExecuteNonQuery();
                MessageBox.Show("Datos eliminados correctamente");
                cmd.Dispose();
            }
        }

    }

}

por ultimo, el formulario a utilizar queda de la siguiente manera, utilizando un BindingNavigator y un DataGridView


Por ultimo dentro del form colocar este código:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace C___SQL
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
           
           
        }
        ACME ejemplo = new ACME();
        BindingSource bs;
        private void Form1_Load(object sender, EventArgs e)
        {
            Mostrar();
                  
        }

        private void Mostrar()
        {
            bs = new BindingSource();
            bs.DataSource = ejemplo.cargarDatos();
            bindingNavigator1.BindingSource = bs;
            dataGridView1.DataSource = bs;
            textBox1.DataBindings.Clear();
            textBox2.DataBindings.Clear();
            textBox3.DataBindings.Clear();
            textBox4.DataBindings.Clear();
            textBox1.DataBindings.Add("text", bs, "nombre");
            textBox2.DataBindings.Add("text", bs, "cargo");
            textBox3.DataBindings.Add("text", bs, "departamento");
            textBox4.DataBindings.Add("text", bs, "id");
        }

        private void Insertar_Click(object sender, EventArgs e)
        {
            ejemplo.InsertarDatos(textBox1.Text, textBox2.Text, textBox3.Text);
            Mostrar();
        }

        private void Modificar_Click(object sender, EventArgs e)
        {
            ejemplo.ModificarDatos(textBox1.Text, textBox2.Text, textBox3.Text, textBox4.Text);
                Mostrar();
        }

        private void Eliminar_Click(object sender, EventArgs e)
        {
            ejemplo.eliminardatos(textBox4.Text);
                Mostrar();
        }

        private void Cerrar_Click(object sender, EventArgs e)
        {
            this.Close();
        }
      
    }

}

Compilamos, ejecutamos y ya esta.