Multiplicar columnas en DataGridView y sumar el total

Que tal! Una vez mas aquí ando con algo que muchas veces se requiere para algunos proyectos hechos con C# y ADO.NET.

Para este ejemplo lo haré de dos maneras – esto no quiere decir que sean las únicas de hacerlo – pero yo así lo voy a hacer c:

Lo primero será crear un proyecto en VS2010 yo lo he llamado MulColsDg (Multiplica Columnas de DatagridView)

Después de esto lo siguiente será agregar la referencia a nuestro proyecto del motor de base de datos que utilizaré para este ejemplo y que será ni mas ni menos que SqlServerCe (Cabe mencionar que si ya tienes tu proyecto con algún dataset, dataadapter conectado a una base de datos como ésta, éste paso no será necesario). Para hacer esto hacemos click derecho sobre la carpeta: References de nuestro proyecto y seleccionamos Add Reference:

Reference

Buscamos uno que se llama: System.Data.SqlServerCe. Podemos ordenar la lista pulsando sobre el encabezado de lista para ordenarlo alfabéticamente. Una vez hecho esto paso procedemos a agregar el using a nuestro proyecto:

using System.Data.SqlServerCe;

Ahora agregaré una base de datos al proyecto con el poderoso y sabio nombre: Database1.sdf:

new item db

Una vez hecho esto le agrego una tabla que tendrá la siguiente estructura o como dijera el sabio @EPN eschuchrr:

SchemeTable

A esta tablita le he agregado algunos valores para que a la hora de consultar contenga algo:

dataMulColdg

Ahora agregaremos un archivo de configuración (en caso de no tener en nuestro proyecto ya un archivo) para saber si ya tienes uno habrá que buscar uno que tengo la extensión *.config.

Sino lo tenemos entones habrá que agregarlo y para hacerlo hacemos click derecho sobre nuestro proyecto(sobre nuestro proyecto, no sobre la solución) Add/New Item:

appconfig

Yo le he dejado el nombre por default app.config y le agrego entre los tags<configuration></configuration> mi cadena de conexión que será a mi base de datos:

<add name="Productos" connectionString="Data Source =|DataDirectory|\Database1.sdf; Persist Security Info = true;" providerName="Microsoft.SqlServerCe.Client.3.5" />

quedando todo el contenido así:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <connectionStrings>
    <add name="Productos" connectionString="Data Source =|DataDirectory|\Database1.sdf; Persist Security Info = true;" providerName="Microsoft.SqlServerCe.Client.3.5" />
  </connectionStrings>
</configuration>

Donde lo único que he agregado es el tag <connectionsStrings> que es de aquí de donde obtendremos la información para conectarnos a esta base de datos y que es la manera usual de hacerl en la aplicaciones N-Tier ó N-Capas. No hay límite podríamos tener 2, 3 ó n conexiones y todas estarían dentro de este tag.

Bien una vez agregado el archivo de configuración agregaré otro espacion de nombres a mi proyecto para poder hacer eso de esta conexión en mi proyecto lo que haré ahora será buscar el espacion de nombres:

System.Configuration este espacion de nombres contiene los tipos que proveen el modelo de programación para el manejo de datos. Mas info

quedando en nuestro proyecto así:

using System.Data;
using System.Data.OleDb;
using System.Drawing;
using System.Linq;using System.Text;
using System.Windows.Forms;
//Los dos nuevos espacios de nombres
using System.Configuration;
using System.Data.SqlServerCe;

Ahora agrego un datagridview a mi formulario vacío y lo ubico donde mejor me plazca 😀 para el ejemplo igual lo puedes hacer tu

Lo que sigue ahora es crear un método en donde lo que haré básicamente será hacer una consulta a la tabla Products, traerme los datos que allí tengo suponiendo que sea una tabla de detalles donde he ido ingresando lo que el usuario en un super, restaurant, comedor, etc lleva en su cuenta:

        /// <summary>
        /// Accediendo a la propiedad ConnectionStrings y al nombre de la conexión que me interesa
        /// </summary>
        string conn = ConfigurationManager.ConnectionStrings["Productos"].ConnectionString;
        /// <summary>
        /// Método que me servirá para mostrar los datos consultados en mi bdd a la tabla
        /// </summary>
        /// <returns>Un DataTable</returns>
        private DataTable GetData()
        {
            //Instanció un DataTable 
            DataTable dt = new DataTable();
            //Hago uso de ADO.NET usando la clase SqlCeConnection definida para el motor de ejemplo Ce = Compact Edition
            using (SqlCeConnection cnn = new SqlCeConnection(conn))
            {
                //Mi consulta
                string sql = @"select IdProduct, Description, Precio, Cantidad from Products order by IdProduct";
                //Abro la conexión
                cnn.Open();
                //Creo un Adaptador de datos y le asigno el valor de la consulta y el valor de mi cadena de conexión
                SqlCeDataAdapter oleDb = new SqlCeDataAdapter(sql, cnn);
                //Lleno el DataTable con lo que contiene el Adaptador de datos
                oleDb.Fill(dt);
                //Creo una columna adicional -No contenida en mi consulta, ni en la tabla para contener el resultado de la 
                //multiplicación de la columna Precio * Cantidad y lo hago a través de la propieda Expression de la clase DataColumn
                DataColumn dc = dt.Columns.Add("Importe", typeof (decimal));
                dc.Expression = "[Precio]*[Cantidad]";
            }
            return dt;
        }

Ahora en el contructor de mi formulario o en el evento Load de mi formulario agregaré la siguiente línea:

dataGridView1.DataSource = GetData();

Quedando todo así:

public Form1()
{
InitializeComponent();
dataGridView1.DataSource = GetData();
}
Listo! Pulso F5 ó Menú Debug/Start Debugging
y pimba!!
Result mul col sin total
Ahora si quisiera mostrar la suma del total del importe??

bueno en ese caso agrego una variable del tipo decimal:

decimal total = 0;

y recorro el datagridview:

foreach (DataGridViewRow row in dataGridView1.Rows)
            {
                total += Convert.ToDecimal(row.Cells["Importe"].Value);
            }

Agrego 2 labels a mi form en una(label1) sólo cambio su propieda text a “Total:” y la otra(label2) queda por default:

y agrego despues de recorrer el grid:

label2.Text = string.Format("{0:C}", total);
//aunque si lo dejo así mostrará el mismo resultado:
label2.Text = total.ToString("C");
//El formato lo tomará la configuración de moneda actual del sistema teniendo en cuanta que si el usuario tiene configurada como euro entones mostrará algo así:

donde lo que hago es formatear el resultado a currency (ToString(“C”))

Y eso es todo. Ejecuto con F5 y Menu /Debug/Start Debugging:

sum result col

Link de descarga del proyecto

Saber el número más grande de una serie dada usando Linq

Que tal en esta entrega haré algo que algunas veces puede ser que se requiera…

La idea es poder saber qué número es el mas grande de una serie de números dada. Es decir si tenemos: 7813216549545 <–El más  de ésta sería sería: 9.

Verdad?

Bien…para eso voy a crear un nuevo proyecto en VS2012 yo lo llamaré MaxOnTextbox.

Al formulario en blanco creado le agrego un textbox, un botón y un label.

Creo el evento click en el botón haciendo doble click sobre él y agrego:

string hola = textBox1.Text;
            List<string> a = new List<string>();
            for (int i = 0; i < hola.Length; i++)
            {
                a.Add(hola[i].ToString());
            }
            label1.Text = a.Max();

Y el resultado:

maxontextbox

Al implementar el método Max() retorna el máximo valor en una secuencia de valores.

Pimba!

PD: Link de descarga del proyecto

Select múltiples tablas con Dataset Tipados

Que tal en este post haré algo que es común (común……y en 4……jejeje) en las tareas habituales de casi cualquier programador o 1/2 programador, 1/4 programador, 1/8 programador, etc….

Bien…para esto crearé un nuevo proyecto en C#, si tienes dudas sobre como crear un nuevo proyecto en VS2010, VS2012, puedes consultar el siguiente enlace para resolver esa terrible duda. Algo así sería:

new

A éste proyecto le he dado el nombre de SelectManyTablesDsTyped, tú le podrás dar el nombre que tu quieras, pero yo he usuado ese nombre.

Por default cuando hemos creado un nuevo proyecto, nos mostará el clásico form vacío de 300×300. Todo hasta aquí sin novedad.

Ahora lo siguiente será agregar una base de datos a nuestro proyecto….para hacerlo hacemos click derecho sobre el nombre de nuestro, NO sobre nuestra solución y seleccionamos New/Item:

new item

Seleecionamos Local Database:

db

para este caso yo le daré el nombre de: MultSelEx(MultipleSelectExample), pero igual tu le puedes dar el nombre que gustes.

Una vez hecho esto crearé 3 tablas de donde haré las consultas y el resultado lo mostraré un datagridview. Hasta aquí todo está tranquilo y sin ningún problema.

<–He sabido de equipos en los que se dificulta la creación de éste tipo de base de datos porque al parecer hubo un error al instalar su VS, les recomiendo para este tipo de cosas:

1.- Quitar todo tipo de skins piratas o no. (sí ya sabes esos que modifican tu barra de estado, colores, íconos, sonidos, etc)

2.-Reinstalar tu OS de nuevo porque al parecer ya ha quedado “embrujado” por tantas cosas que le has instalado sin saber como ha reaccionado tu equipo.

3.-Tira por la ventana ese equipo y hazte de uno nuevo <–Caso extremo, pero útil 🙂 –>

Bueno una vez terminado ese breve resúmen sobre algún problema que he visto continuo.

Abro el Server Explorer sino sabes donde está pues ir entonces a Menú/View/Server Explorer ó el atajo Ctrl+W+L y pimba!

Multidb

Pulsamos doble click sobre la nueva base de datos recién creada, y sobre el nodo Tables, click derecho Create Table y está será la estructura de las 3 tablas que para no hacer tanto rollo las he creado así:

MultiCategoryTable MultiPriceTable MultiProductTable

Una tabla de productos, una de categorías y una que se llama precio. Que para este ejemplo la he creado así, con esto no quiero decir que así se acostumbra hacer, ni que así lo hago ni etc, ni nada de eso.

Bien…aclarado y terminado lo anterior procedo a agregar datos a las tablas para poder mostrar esos datos en mi datagridview dentro del form vacío hasta ahorita.

Y me quedaría algo así:

Categorías, precios y productos:

MultiCategoryData MultiPriceData MultiProductData

Ahora habrá que agregar un dataset a nuestro proyecto, para hacer esto mostramos la ventana Data Sources Menú/View/Other Windows/Data Sources ó el atajo Shift+Alt+D, pulsamos sobre el enlace Add New Data Source ó sobre el ícono al lado superior izquierdo de la ventana:

new ds

Y siguiente>siguiente>siguiente. Todo por default está bien….al fin que estamos ejemplificando 🙂

Llegada la parte donde nos muestra las tablas seleccionamos nuetra 3 tablas y eso es todo.

Listo! Lo que sigue es agregar un Datagridview a nuestro form recién creado por nuestro proyecto.

Y ahora viene esta parte que es simple solo habrá que hacerlo con atención.

Primero vamos a seleccionar cualquiera de nuestras tablas en la ventana Data Sources desde el nodo ubicado al lado izquierdo de alguna de ellas y podemos seleccionar detalles o datagridview, eso no importa aquí.

Al hacer esto tengo algo así:

MultiProductFormFromDs

Lo que está arriba(textbox, bindingnavigator, label,etc no me sirven, al menos para este ejemplo así que las quitaré mas adelante)

Bien ahora lo que haré será crear una consulta que será la que mostraré al cargar este form. Para esto pulso sobre el smartag ubicado al lado superior derecho del tableAdapterManager que se ha creado al arrastrar esta tabla sobre mi form:

TableAdapterManagerselecciono la opción Edit in DataSet

y me mostrará lo siguiente:

y hago click derecho sobre el DataTable Products en su ProductTableAdapter y selecciono la opción Add Query:

MultiAddQuery

Ésto abrirá el wizard para consultas

sql statsel return row

>siguiente 😦

Y  ahora cómo quedaría la consulta:

Texto de la consulta:

SELECT        p.IdProduct Clave, p.Description Descripción, c.Name Categoría, pr.ProductPrice Precio
FROM            Product p, Category c, Price pr
where p.IdCat = c.IdCategory
and p.IdProduct = pr.IdProduct

>siguiente 😦

MultiNameSelect

le he dado un nombre que tenga que ver con lo que me retornará la consulta, pero igual…tu le puedes dar el nombre que quieras.

>siguiente, tal vez muestre una advertencia que dices que nuestra consulta muestra más tablas que las que están dentro de nuestro productTableAdapter, está bien. todo bien hasta aquí.

y ahora agregamos ésta línea de código a nuestro form en el evento Load donde tendremos algo así ya en el:

// TODO: This line of code loads data into the 'multSelExDataSet.Product' table. You can move, or remove it, as needed.
            //this.productTableAdapter.Fill(this.multSelExDataSet.Product);
Justo debajo de ésta líneas agregaré lo siguiente:
this.dataGridView1.DataSource = productTableAdapter.GetAllDesc();

Y eso es todo. Ahora ejecuto con F5 o menu Debug/Start Debugging y esto obtengo:

MultiResultnotarás que hay otros 3 campos “extraños” que están dentro de nuestro grid. Esto se debe que nuestro table adapter contiene un método FillBy que ya trae consigo estás 3 columnas que son las que están en la tabla.

Para quitar estos campos que no son deseados podemos hacerlo dos maneras:

1ra.- Nos vamos de nuevo a nuestro Dataset ya sea a través del smartag ubicado en al lado superior derecho del objeto productTableAdapter, nos mostrará el dataset donde agregamos nuestra consulta donde unimos nuestras 3 tablas y veremos en el TableAdapter de la tabla productos los dos métodos: Fill, GetData() y el agregado por nosotros: GetMultiProducts, GetAllDesc(). Bien pues hacemos click derecho sobre el primero Fill y selecciona configure:

Remove columns Multinos mostrará el wizard y lo único que habrá que hacer será pegar la consulta que creamos hace algunos pasos atrás. Siguiente, siguinte, Finalizar. Listo!!

Cambiamos la las líneas que tenemos en nuestro evento Load:

// TODO: This line of code loads data into the 'multSelExDataSet.Product' table. You can move, or remove it, as needed.
//this.productTableAdapter.Fill(this.multSelExDataSet.Product);
Justo debajo de ésta líneas agregaré lo siguiente:
this.dataGridView1.DataSource = productTableAdapter.GetData();

Lo único que he cambiado es que ahora en lugar de llamar a nuestro método creado GetAllDesc(), he llamado al que nos crea el wizard por default al arrastrar en aquel paso la tabla a nuestro form y que se llama GetData(), pulsamos F5 ó Menu/Debug/Start Debugging:

Result edited dsY listo! Ya muestra sólo los datos de la consulta.

2da.- Sin hacer nada de lo anterior justo debajo de lo que tenemos escrito en el evento Load de nuestro form agregamos lo siguiente:

this.dataGridView1.Columns[0].Visible = false;
this.dataGridView1.Columns[1].Visible = false;
this.dataGridView1.Columns[2].Visible = false;

Donde lo que hacemos es ocultas las 3 primeras columnas del DatagridView

y ejecutamos:

Result edited dsY listo! ya ha quedado.

Bien si ahora quisieramos mostrar este resultado, pero basado en un parámetro que venga de un textbox habrá que agregar otra consulta donde ésta espere el valor y lo mostrarmos en el grid.

Hacemos lo mismo que hicimos pasos atrás: nueva consulta que ha quedado así:

SELECT        p.IdProduct Clave, p.Description Descripción, c.Name Categoría, pr.ProductPrice Precio
FROM            Product p, Category c, Price pr
where p.IdCat = c.IdCategory
and p.IdProduct = pr.IdProduct
and p.IdProduct = @Id

Pero ahora no ocupo que llene nada así que sólo marcaré la opción Return DataTable:

MultiWithParamHabrá que tener cuidado con esta opción ya que no es necesario tener marcada la primera Fill a DataTable.

Agrego un label que en su propiedad Text la he cambiado por Encuentra:, un textbox y un botón con todo por default. Hago doble click sobre el botón para agregar el evento click a él mismo y agrego lo siguiente:

this.dataGridView1.DataSource = productTableAdapter.MultiGetPrByParam(Convert.ToInt32(textBox1.Text));

Aquí es importante hacer la conversión a entero (Convert.ToInt32) ya que el tipo de dato por el cuál haré la búsqueda es del tipo entero y si lo dejo por default me marcará un error. Ejecuto con F5 y veo el resultado:

multi result query param

Pimba!! Que se haga la luz!

Ahora si queremos que cuando se borre lo que esté en el textbox se restaure nuestro grid con el resultado de nuestra consulta cuando carga el form pues habrá que crear un evento en nuestro textbox en TextChanged y etc. Eso te lo dejo de tarea.

Hasta la próxima. Abuuuurrr!

PD. Link de descarga

Búsqueda y mostrar resultado en DataGridView usando DataSet tipados

Bien….pues ahora vamos con esto que es básico también en casi cualquier aplicación que se precie de serlo.

Primero vamos a crear un nuevo proyecto y que para este ejemplo lo he llamado: BuscarDsTipados

new

Una vez creado pues nos muestra nuestro clásico form vacío. Ahora lo que sigue será agregar una base de datos. De nuevo recurrimos al gran sql server compact edition. Para hacer esto hacemos click derecho sobre nuestro proyecto/Add/New Item

item

Local Database:

db

Para este ejemplo yo le he puesto el nombre de SDataEx(Search DataExample)

Bien ahora le que sigue será agregar una tabla que será donde se hará la búsqueda y el resultado se mostrará en nuestro datagridview para esto abrimos nuestro server explorer que si no es visible lo podemos hacer mediante el menú View/Server Explorer ó el atajo Ctrl+W+L

Ya estándo allí hacemos click derecho sobre el nodo Tables y seleccionamos Create Table:

new table

Yo crearé una llamada Books que contendrá sólo 3 campos: ISBN, Description y Editorial. Sólo contendrá estos campos ya que si le quisiera agrear una columna como autores lo recomendable para estos casos es tener una tabla de autores e irlos agregando al libro de una manera similar a como lo hice en un ejemplo que sirve para relacionar combos.

(Aunque lo ideal es tambien tener una tabla de editoriales)

Bien…una vez esto así quedaría la estructura de la tabla ó como lo diría el sabio @EPN (eschuchur):

books table

Bien una vez hecho agregaré unos datos a la tabla:

data books

Listo!

Hecho esto habrá que agregar una nueva fuente de datos o dataset a nuestro proyecto. Para esto abrimos la ventana Data Sources. Sino está visible lo podremos hacer desde el menú View/Other Windows/Data Sources en caso de usar VS2102 o Menú/View/Show Data Sources en VS2010 ó con el atajo Shift+Alt+D

new ds

Y hacemos el clásico siguiente>siguiente>siguiente:

Primero seleccionamos la opción Database>Dataset>

new ds1new ds2

Seleccionamos la conexión por default que en este caso es el nombre de la bdd que es SDataEx.sdf > Guardamos el connections string por si lo ocuparamos después:

new ds books connconn books

Y seleccionamos la tabla que tenemos:

sel table books

Listo! Pulsamos en finish para cerrar el asistente y veremos que se ha creado el objeto Dataset con el nombre por default que para este ejemplo fue: SDataExDataSet

Ahora viene la parte más “peligrosa” habrá que arrastrar desde la ventana Data Sources la tabla Books habiendo seleccionado la opción Details al lado derecho del nobre de la tabla a nuestro formulario vacío :

sel table ds books

Quedandonos algo así:

book on forms

Listo!! Ya tenemo un form ABM(Agrega, Borra, Modifica) completo. Ahora a lo que viene el título del post.

Si somos observadores en la parte inferior de nuestro form se han agregado algunos objetos nuevos: SDataExDataSet, booksBindingSource, booksTableAdapter, tableAdapterManager, booksBindingNavigator. Cada uno tiene su función que no lo vamos a explicar en este post :/, ya habrá algún otro para hacerlo.

Por lo pronto nos enfocaremos en el objeto: booksTableAdapter que es el que contiene los datos a la tabla de la cuál buscamos hacer la consulta, clickamos en el smartag, sí esa flechita que aparece en la esquina superior derecha del objeto y seleccionamos la opción: Edit Queries y DataSet Designer ó Editar consulta en el diseñador:

edit querys

Una vez hecho lo anterior abrira el Diseñador de dataset y nos motrará el DataTable conteniendo a su respectivo TableAdapter:

Seleccionamos el tableAdapter de la tabla quen este caso es BooksTableAdapter/Click derecho/Add/Query:

add query books

Y que crees? Así es! Se abrirá otro asistente pero ahora será el diseñador de consultas:

Seleccionamos la primera opción Use Select statements ó usar sentencias sql:

sql stat

siguiente >

Select which return rows:

sel return row

Aquí viene la parte donde agregaremos un parámetro a nuestra consulta llamado: clave y que es precedido por el símbolo: “@” para consultas con parámetros en sql server así se usa para ésta sea devuelta conforme a lo que necesitamos. Aquí tendremos que ser cuidadasos sobre que campo deseamos hacer la consulta. En este caso yo lo he hecho sobre el campo ISBN que su tipo de dato es un nvarchar, pero si quisieras hacerlo por un campo el cuál es el del tipo int, double u otro, habrá que hacer la conversión más adelante en donde se requiere. Por lo pronto aquí está bien.:

param books

Una vez hecha nuestra consulta que en realidad sólo he agregado una línea a partir del where….podemos probar el resultado pulsando el botón Query Builder al lado inferior derecho del textbox para escribir nuestra consulta. Al pulsar este botón veremos este otro asistente:

ex query si pulsamos sobre execute query abrirá una nueva ventana donde escribiremos el valor de ese parámetro que espera para que pueda retornar un resultado:

add param pulso en Ok y:

result sel books

Me muestra el resultado de mi consulta

Bien ya terminado todo lo anterior proseguimos pulsamos en siguiente y marcaremos la opción Return DataTable en el asistente solamente y le daremos un nombre que sea específico a lo que queremos hacer:

return sel dat

que en este caso yo le he dado el nombre de BuscaXISBN

Pulsamos finish para cerrar el asistente y listo!!…no ya casi… 😦

Regresamos ahora a nuestro diseñador de formularios en donde tenemos nuetra ventana donde arrastramos desde el dataset la tabla books y agregamos un panel, un datagridview desde el toolboox en la categoría Data, un textbox y un label y lo ubicamos donde nosotros nos parezca mejor quedando en mi caso algo así:

books acom

Yo he logrado este acomodo primero agregué el panel en la parte de abajo del form y en su propiedad Dock la puesto en bottom, y dentro de este panel agregué el datagridview, en el smartag del datagridview clické en la opción Dock in parent container y listo! Al label le cambié su propiedad text por Buscar ISBN: y el texbox nuevo(textbox1) adicional sólo lo he puesto a la derecha del label. Con esto sólo nos quedan uno o dos pasos más.

Primero en el binding navigator agregarémos un botón haciendo click sobre y veremos que nos da varias opciones, elegirémos Button o botón según sea el caso del idioma de tu VS:

add btn binding

Logrado esto procederemos a agregar una imágen a nuetro botón para que tenga una apariencia más apropida a lo que hará que será un búsqueda para hacerlo hacemos click derecho sobre el nuevo botón y seleccionamos la opción Set Image, buscamos alguna que nos agrade y se adapte a la necesidad y en mi caso al botón cambié su propiedad text y le he puesto Buscar y he cambio el DisplayStyle por Image and Text:

busca binding

Y listo! Ya casi 😦

Ahora hacemos doble click sobre ese botón nuevo que acabamos de crear, y esto generará el evento click para ese botón y en el escribiremos el siguiente código:

this.dataGridView1.DataSource = this.booksTableAdapter.BuscarXISBN(textBox1.Text);

quedando algo así todo el código del evento click:

private void toolStripButton1_Click(object sender, EventArgs e)
        {
            this.dataGridView1.DataSource = this.booksTableAdapter.BuscarXISBN(textBox1.Text);
        }

Y ahora sí!! Ha quedado nuestro form con consulta a la bdd a 1 tabla para probar pulsamos F5 en nuestro proyecto para ver el resultado:

y se puede ver que el resultado es correcto:

resul busca books isbn

Eso es todo!!

PD: Ahora si en nuestro campo por el cual queremos buscar es un tipo de dato int, double o alguno distinto a nvarchar entonces lo que haríamos sería parseralo a su tipo correspondiente, que para el caso de ser int sería algo así:

private void toolStripButton1_Click(object sender, EventArgs e)
        {
            this.dataGridView1.DataSource = this.booksTableAdapter.BuscarXISBN(Convert.ToInt32(textBox1.Text));
        }

Con lo cuál estaríamos haciendo una conversión de lo que se encuentre en el textbox para que el resultado sea el correcto. Si lo que quisieramos es que en el textbox sólo ingresaran mayúsculas, números entonces tendríamos que recurrir a otro recurso que será tema para otro post.

Saludos!

Proyecto para descarga

Combobox relacionados desde bdd usando dataset tipados

Hola lo que intento hacer aquí es resolver algún problema que he visto con algunas personas al intentar agregar productos, clientes, etc donde al agregar el orígen de alguna de las relaciones de la bdd está en varias tablas(al menos 2 como en este caso para ejemplo). Bueno lo que hice aquí fue mostrar como relacionar en un combox datos de otra tabla para que al agregar los datos de un formulario se agregue la relación pero de la forma común (es decir como un usuario común lo haría :D) evitar categoria: 1, provedor 2. En lugar de esto seleccionar categoría: Abarrotes, Proveedor: AMC, etc

Bueno de esto trata el ejemplo, aunque no se limita solo a eso y ya se verá.

Empezamos…

Primero será crear un proyecto del tipo windows forms:

Image

Al proyecto yo le he dado el nombre de ComboFiltrado. Tu le podrás dar el nombre que tu gustes.

Siguiente: Agregar una base de datos al proyecto, yo he usado el grandioso Sql Server Compact Edition

Para hacer esto hacemos click derecho sobre nuestro proyecto/add/New item:

Image

Bucamos en la categoría Data/Local Database y si vemos la extensión será un archivo con extensión .sdf:

Image

Yo le he dado el nombre a la base de datos de: dbEx (de database Example)

Lo siguiente será abrir la base de datos desde el server explorer:

Image

Si no esta visible vamos a Menú/Ver/Server Explorer ó el atajo Ctrl+W+L

Ahora click derecho sobre el nodo Tables y agregamos 2 para este ejemplo.

Yo he agregado solo 2:

Image

Las cuales tienen la siguiente estructura (infraschuchur dijera el sabio @EPN):

Image

Image

Y por último le he agregado unos datos a la tabla categories:

Image

Sólo para que hay ítems que mostrar en el combo.

Lo siguiente será agregar un dataset a nuestro proyecto. Para esto nos vamos de nuevo al Menú/Data/Show DataSources <<- En caso de usar VS2010 en este caso que estoy usuando VS2012 sería Menú/View/Other Windows/Data Sources ó el atajo Shift+Alt+D

Una vez mostrado el panel hacemos click en Add New Data Source:

Image

Se abre el asistente e inicia el siguiente>siguiente>siguiente:

La primera opción sería seleccionar Database:

Image

Lo siguiente…seleccionar la opción Dataset:

Image

Lo siguiente es seleccionar la base de datos:

Image

Notarás que por default te ha seleccionado la conexión activa en el asistente que en mi caso es la base de datos dbEx.sdf y si desplegamos el connections string veremos lo que contiene.

Siguiente :D: Guardar la cadena de conexión en el archivo app.conf esto es recomendable ya que pudieramos usar este archivo para futuras consultas donde no sea posible hacerlo con el asistente. Yo he dejado todo por default:

Image

Y siguiente 😀  :

Ahora lo que sigue sería seleccionar las tablas que estén dentro de nuestro conjunto de datos. Que para este ejemplo son sólo 2:

Image

Y he dejado el nombre del dataset con el nombre por default.

Listo! Hasta este punto hemos creado una base de datos, 2 tablas, agreado datos a una de estas tablas y agregado un dataset a nuestro proyecto.

Ahora lo que sigue será agregar el contenido de unas de las tablas a nuestro form por default creado al crear nuestro proyecto. Esta tabla será la tabla Products y para hacer esto nos vamos a la ventana datasources y seleccionamos la tabla Productos del nodo que aparece al lado derecho del nombre de la tabla seleccionando la opción Details o Detalles según el idioma de nuestro VS:

Image

Esto que sigue es un paso “peligroso” 😦 así que deberemos tener cuidado en hacerlo correctamente para evitar errores.

Una vez seleccionada la opción detalles de la tabla arrastramos hacia nuestro formulario vació la tabla Products  nos quedará algo como esto:

Image

Si somos observadores notaremos que también debajo de nuestro form en la zona que está justo donde termina nuestro form habrá algunos objetos nuevos como dbExDataset, productsBindingSource y otros mas. Sí?

Bien…ya quedó!! este formulario es pefectamente funcional! Ya podemos agregar productos a nuestra tabla. Lo único malo es que para agregar la categoría a la cual pertenece el producto pues deberemos saber el id de esa categoría lo cuál no es para nada de ninjas eso :/ y además que a cualquier usuario que no sea científico o le falten recursos mentales para agregar los datos a nuestra tabla pues se las verá complicados haciéndolo de esta forma. Bueno y a fin de cuenta de lo que se trata este post es de agregar un combobox relacionado a nuestro form para que podamos mostrar el contenido de la otra tabla si tener que memorizar las claves de dicha tabla relacionada(-Espera! no hemos relacionado las tablas :/ bueno…eso será en otro post para no complicar tanto esto. :d). Bien pues lo que sigue entonces será agregar un combobox a nuestro form1. Esto lo hacemos desde nuestro toolbox, buscamos el combobox y lo arrastramos hacia nuestro form o simplemente hacemos doble click sobre el y veremos como se ha agregado a nuestro form. Ahora lo que sigue será colocarlo en una posición que nos de a entender algo.

Algo así:

Image

Notarás algunas cosas: Primero el textbox que aparece a un lado del combobox tiene un color de fondo distitnto, para hacer esto simplemente lo he seleccionado, y en su propiedad BackColor la he puesto en info y lo he recargado un poco a la derecha para que se muestre a un lado del combobox como parte del valor categoría(aunque no es necesario, para este ejemplo así esta hecho.)

Bien lo que sigue será hacer que ese combobox recién agregado muestre datos y para esto seleccionamos el combobox y en el smarttag <<–?? (sí esa pequeña flechita que aparece del lado superior derecho del control):

Image

Seleccionamos un datasource de los mostrados:

Image

Que este caso será el de categories:

Image

Aquí hay otro paso “peligroso” y habrá que ser cuidadoso. Primero en la propiedad Data Source será categories. El Display member es decir el texto que queremos aparezca en el combobox cuando se despliega este será el campo Name de la tabla y en la siguiente propiedad Value member será el campo IdCat que será la clave del valor seleccionado.

Y listo! ya ha quedado relacionado el combobox. Lo que sigue será agregar un evento apra que al seleccionar un valor del combobox la clave se muestre dentro de nuestro textbox idCat, sí ya sabes ese  que le cambiamos el color de fondo por el color Info.

Para hacer esto seleecionamos el control combobox y nos vamos a la ventana propiedades y buscamos un ícono que parece un rayo:

Image

Bien una vez encontrado pulsamos sobre el y buscamos un evento que se llama: SelectionChangedCommited y hacemos doble click al derecho del nombre y listo! Ya hemos creado tal evento y nos llevará al código de dicho evento y notaremos que nuestro cursor está justo en medio de dicho evento y lo que tendremos que agregar será está línea:

idCatTextBox.Text = cbCat.SelectedValue.ToString();

Que lo que estamos diciendo es que el valor del textbox en su propiedad text  IdCatTextBox.Text <<– tendrá el valor del valor (SelectedValue) de la opción seleccionada del comboboox(DisplayMember).

Y listo! ahora si pulsamos F5 sobre nuestro proyecto veremos que nuesto combobox muestra los valores de nuesta tabla y al seleccionar uno de ellos el texto del textbox IdCatTextBox cambia:

Image

Y eso es todo. Notarán que en la zona de abajo he agregado un datagridview con los datos que tiene la tabla productos. Esto es simple solo habrá que seleccionar desde la ventana DataSource la tabla Producs y en la opción del combobox seleccionaremos ahora en lugar de Details la opción DataGridView y lo arrastramos al form y el resultado será el que ven en la captura. Además de 3 botones que he agregado al lado derecho para aumenter un poco la funcionalidad, pero eso lo explicaré en otro post.

Saludos y hasta pronto!

PD: Proyecto para descargar

Crear y consumir webservice básico con C#

En este post haré lo posible por crear un webservice de una manera lo mas simple posible :).

Reviviendo el post 😉

Antes que nada habrá que crear como siempre un nuevo proyecto y para esto elegiré uno de consola. Con eso será suficiente para lo que prentendo hacer para este ejemplo.

Una ves creado el proyecto le agregaré otro proyecto a mi solución. Para esto click derecho sobre mi solución NO proyecto y agrego un nuevo proyecto:

New ws

Elijo la categoría web y el tipo de proyecto será ASP.NET Web Service Application y le dejo el nombre por default WebService1:

ws

Dentro del namespace WebService1 tendrá algo como ésto:

/// <summary>
    /// Summary description for Service1
    /// </summary>
    [WebService(Namespace = "http://tempuri.org/")]
    [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
    [System.ComponentModel.ToolboxItem(false)]
    // To allow this Web Service to be called from script, using ASP.NET AJAX, uncomment the following line. 
    // [System.Web.Script.Services.ScriptService]
    public class Service1 : System.Web.Services.WebService
    {

        [WebMethod]
        public string HelloWorld()
        {
            return "Hello World";
        }
    }

Que es el contenido que por default nos genera el diseñador en cada WebService a partir de ahora ws.

Bien…lo que haré será modificar un poco el método por default generado(HellWorld) en el ws agregando algo simple como algún cálculo:

El método HelloWorld le he cambiado el nombre y su contenido por esto:

[WebMethod]
//Venerando al glorioso Bob Sponge
        public double SquarePants(double a, double b)
        {
            return Math.Pow(a, b);
        }

Ahora lo que sigue será agregar la referencia de servicio a mi proyecto de consola:

add ws ref

Pulsar el botón Discover para que de manera automática detecte mi VS los servicios dentro de mi proyecto:

ws name added

Aquí habrá que notar 4 puntos:

1.- Por default nos aloja el ws en el servidor por default embebido dentro de nuestro VS con el puerto asignado automáticamente(hay manera de cambiar esto, pero en este post no se verá eso).

2.-El servicio muestra los namespaces incluídos dentro del ws así como los métodos del lado derecho en Operations.

3.- El método o los métodos dentro de nuestro ws que en este ejemplo es sólo uno.

4.- El nombre que le podemos asignar al namespace comoa referncia de servicio.

Una vez hecho esto notaremos como a nuestro Solution explorer otros componentes:

se ws

Bien lo que sigue será agregar la la referencia a nuestro proyecto:

using ConWsEx.ServiceReference1; //ConWsEx <--Nombre del proyecto

Y ahora en mi proyecto consola crearé una instancia del ws para poder acceder/consumir a sus métodos/propiedades, que en este ejemplo sólo hay un método:

Service1SoapClient ws = new Service1SoapClient();

Y agrego:

Console.Write("Elevar: \t");
            double x = Convert.ToDouble(Console.ReadLine()); 
            Console.Write("Al    : \t");
            double y = Convert.ToDouble(Console.ReadLine());

            Console.WriteLine("El resultado de elevar {0} a {1} es: \n\t{2}", x, y, ws.SquarePants(x, y));
            //wait for a key
            Console.ReadKey(true);

Ejecuto la aplicación con F5 ó Menú Debug/Start Debugging y muestro el resultado:

resultado

Eso es todo!!

Link de descarga al proyecto

Publicado desde WordPress para Windows Phone

Resetear Menus/Comandos Visual Studio /Setup (devenv.exe)

Que tal hace una días me encontré con que a mi Visual Studio al parecer se había poseído por alguna razón y al querer agregar alguna clase o interfaz a mi proyecto estas opciones no me aparecian solo windows forms y las demás. Algo así:

Image

Y para esto lo que tuve que hacer fue ejecutar en la consola de visual studio:

Inicio/Todos los programas/Visual Studio 2010/Visual Studio Tools/Visual Studio Command Prompt (2010)

Y ejecutar el comando:

devenv /setup

Qué es lo que hace este comando ?

Según la documentación MSDN:

Forces Visual Studio to merge the resource metadata that describes menus, toolbars, and command groups, from all available VSPackages.

En otras palabras forza a los menúes, barras de herramientas y comandos a combinarse/fusionarse de manera tal que quedan como en un inicio de la instalación.

Espero y pueda ser de ayuda.

Mejorar el rendimiento de Windows 8 a través del registro

Este es un post original de aquí: Windows 8 Improve… está en inglés, pero creo que es muy sencillo de entender  y además se me hizo importante publicarlo debido a que es la novedad y para que los que ya lo tienen vayan viendo algunas opciones de mejora para el nuevo OS de Microsoft.

Windows 8 comes with awesome features like Start Screen, Windows Store apps etc. and has better or faster performance than previous versions. But, that does not mean that you can’t improve the performance of Windows 8 even more.
In this article I will show you some tricks that helps improve the performance of Windows 8 and makes it a little faster than before.
Here I’ll discuss two ways that will improve your Windows 8 experience.
MenuShowDelay
MenuShowDelay describes the time that will be taken to open a menu item in the computer. It is a property of the Windows Registry. The default value of this property is set to 400. But, you can set it in the Registry Editor easily. The value must be between 0-20. This is the time (in milliseconds) it takes from the moment your cursor is placed over a menu until the relevant menu appears.
Step 1
Press the Win+R key to open the Run box. Type regedit.exe into the Open box. Click the Ok button.
Run-Command-In-Windows8.jpg
Step 2
Go down the following path in the Registry Editor window.
HKEY_CURRENT_USER->Control Panel->Desktop.
ShowMenu-Delay-property-in-Windows8.jpg
Step 3
Select the property called MenuShowDelay and double-click on it to the modify the value.
ShowMenu-Delay-property-in-registry-Windows8.jpg
Step 4
The default value is set 400. Now, change the Value data to a value between 0-20. Click Ok.
set-value-of-showdelaytime-in-windows8.jpg
MouseHoverTime. It is another property that you will find in the path. This property specifies the time that will be taken by the system to open a pop-up menu when you move the mouse cursor over an item. The default value of this property is set to 400. Give a smaller value to increase the performance of this property.
Procedure to be followed.

Step 1
Go down the following path in the Registry Editor window.
HKEY_CURRENT_USER->Control Panel->Mouse.
mouse-property-in-windows8.jpg Step 2
Select the MouseHoverTime from the right panel of the window. Right-click on it to modify the value.
mouse-hover-time-in-windows8.jpg
Step 3
The default value is set 400. Now, change the Value data to a value between 0-20. Click Ok.
mouse-hover-time-in-registry-windows8.jpg
Step 4

Now, you need to restart the computer system to get the effect immediately.
Conclusion
Hope this article will help you to increase the performance of your Windows 8 System.

Lo he probado en mi escritorio y funciona de maravilla espero y te resulte igual. 😀

Insertar datos en base de datos access 2007 ó inferior

Primero que nada quiero resaltar que este es un tutorial básico para quien quiere comenzar a utilizar la base de datos access como parte de alguna aplicación tal vez un poco sencilla: un usuario, dos tal vez(pero no usando la misma bdd c/u porque estarán asíncronos c/u). Otro comentario que podría(y debo hacer) es que para este tutorial suponemos que la base de datos no está protegida porque utilizaremos .NET Framework Data Provider for OLE DB sin necesidad de usar protección por password. Si quisieramos hacerlo con una bdd protegida sólo habría que agregarlo en la cadena de conexión.
Bueno…dicho lo anterior inicio:
Primero el espacio de nombres que utilizaré es:
System.Data.OleDb;
El cuál puede ser agregado al inicio de nuestro proyecto quedando algo así las referencias:

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

Ahora…se pretende que exista una bdd simple con una tabla hecha en access y con extensión .mdb y solo contenta los campos: Nombre, Direccion y Telefono. Sino la tienes podrás descargarla desde el archivo del proyecto.
Bien entremos ahora más en detalle:
Cadena de conexión (Nótese que no tiene password la base de datos) y tendrás que copiarla a la ruta donde la ocupes:

private string acconn = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\bd\bdcomun.mdb;Persist Security Info=True";

Para lograr hacer el registro haré un método desde el cuál se hará la inserción y lo llamaré:

private void InsertarDatosEmpleados()
{
}

en donde voy a agregar la funcionalidad algo así:

//Asignando el valor de los textbox a variables para recuperar valor y después insertarlos
            string nuser = textBox1.Text;
            string duser = textBox2.Text;
            string tuser = maskedTextBox1.Text;

Creo una instancia de la clase OledbConnetion pasandole el valor de la cadena de conexión como parámetro:

OleDbConnection cnn = new OleDbConnection(acconn);

Después es simple…solo agrego mi cadena que contiena la instrucción de inserción definidad en una variable constante.

const string insert = @"insert into clientes(nombre, direccion, telefono)
                values (@nuser, @duser, @tuser)";
//Instancio el OledbCommand pasandole los dos argumentos necesarios para realizar la operación
                OleDbCommand cmd = new OleDbCommand(insert, cnn);
                cmd.Parameters.AddWithValue("@nuser", nuser);
                cmd.Parameters.AddWithValue("@duser", duser);
                cmd.Parameters.AddWithValue("@tuser", tuser);
                cnn.Open();
                int exe = cmd.ExecuteNonQuery();
                cnn.Close();

Es importante resaltar que la parte en donde paso los parámetros hacia la instrucción sql que será interpretada por el motor de base de datos que en este caso es access no es igual que pasarlos a otros motores.
Este pequeño método tiene todo lo necesario para realizar la operación y listo !!
El método InsertarDatosEmpleados quedaría así:

private void InsertarDatosEmpleados()
        {
            //Asignando el valor de los textbox a variables para recuperar valor y después insertarlos
            string nuser = textBox1.Text;
            string duser = textBox2.Text;
            string tuser = maskedTextBox1.Text;
            try
            {
                OleDbConnection cnn = new OleDbConnection(acconn);
                const string insert = @"insert into clientes(nombre, direccion, telefono)
                values (@nuser, @duser, @tuser)";
                OleDbCommand cmd = new OleDbCommand(insert, cnn);
                cmd.Parameters.AddWithValue("@nuser", nuser);
                cmd.Parameters.AddWithValue("@duser", duser);
                cmd.Parameters.AddWithValue("@tuser", tuser);
                cnn.Open();
                int exe = cmd.ExecuteNonQuery();
                cnn.Close();
            }
            catch (OleDbException ex)
            {
                MessageBox.Show("Ocurrió un error al insertar: {0} ", ex.Message);
            }
        }

y desde donde lo mandaríamos llamar sería desde el botón de nuestra aplicación quedando algo así:

private void button1_Click(object sender, EventArgs e)
        {
            if (validFields())
                InsertarDatosEmpleados();
            else
                MessageBox.Show("Necesita llenar todos los campos vacíos", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
        }

He agregado una validación para que los campos cotengan información pero es simple y se puede ver en el archivo del proyecto.
Descarga del proyecto:

https://www.box.com/s/6bc9dee5bec23ffe3991

Crear un proyecto con Visual Studio 2008, 2010, 2011

Que tal pues ahora voy a hacer un pequeño post sobre cómo crear un proyecto en blanco en Visual Studio 2010(uff !). Tal vez para algunos pueda ser soso o x pero este tema es para quienes apenas comienza a utilizar la herramienta.

Primero que nada habrá que tener instalado visual studio en cualquiera de sus versiones. Si no lo tienen lo pueden descargar desde aquí. Teniendo en cuenta que ya tienes VS instalado procedemos a abrirlo desde el menú inicio/Microsoft Visual Studio 2010(suponiendo que descargaste esta)/y abrir: Microsoft Visual Studio 2010 y nos aparecerá una ventana como esta:

Pulsamos en nuevo proyecto y nos aparecerá la opción para elegir el tipo de proyecto:

Aquí se puede elegir el lenguaje asi como decidir si será un proyecto web, sharepoint, mvc, de consola, etc. En esta ocasión seleccionaremos ConsoleApplication1 para hacer el clásico Hola Mundo que no mostraré algo tan trillado pero sí algo similar.

En la parte del nombre del proyecto elegimos uno(que tenga que ver con tu proyecto de preferencia), La ruta donde será almacenado el proyecto y el nombre de la solución.

Por default VS nos crea espacios de nombre para ser usados pero nosotros podremos agregar los que consideremos, pero ese no es tema para este post.

La estructura de un programa base de consola es algo así:

//Espacios de nombres en un proyecto por default.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
//Espacio de nombre de nuestro proyecto
namespace wpInicioProy
{
    class Program
    {
        static void Main(string[] args)
        {
        }
    }
}

Y ahora vamos a agregar algo para ver cómo funciona VS:
Agregamos esto dentro del método Main de nuestro programa:

string nombre = "";
            Console.WriteLine("¿Podrías decirme tu nombre?\n");
            nombre = Console.ReadLine();
            Console.WriteLine("Esto es sólo el inicio: {0}", nombre);
            Console.ReadLine();

De tal manera que nos quedará algo así todo nuestro proyecto:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace wpInicioProy
{
    internal class Program
    {
        private static void Main(string[] args)
        {
            string nombre = "";
            Console.WriteLine("¿Podrías decirme tu nombre?\n");
            nombre = Console.ReadLine();
            Console.WriteLine("Esto es sólo el inicio: {0}", nombre);
            Console.ReadLine();
        }
    }
}

Pulsamos F5 o menú Depurar/Iniciar depuración – Debug/Start Debugging
Y Listo ! Ya hemos creado nuestro primer proyecto

Descarga del proyecto:
https://www.box.com/s/6507308e080a9da4c725