[DataGridView] - Uso del DataGridViewComboBoxColumn
Introduccin
Este articulo tendr por objetivo mostrar como trabajar con las columna del tipo
ComboBox que se encuentran dentro de una celda del datagridview.
1- Definicin de las columnas en tiempo de diseo
Un paso importante es la definicin de las columnas para ello en este caso explicare
como hacerlo en tiempo de diseo y poder as controlar que datos visualizar.
La opcin para realizar esta operacin se encuentra haciendo click con el botn
derecho del mouse en el control DataGridView del formulario, visualizando una lista
de tems como se muestran en la imagen
Aqu puede seleccionarse dos opciones:
- Agregar nuevas columnas a la grilla por medio de la opcin Add Column
visualizndose el siguiente cuadro:
Como se observa en la imagen, puede definirse informacin rpida del tipo de
columna que se quiere representar en la grilla.
- Editar columnas existentes, mediante la opcin Edit Columns visualizando un
cuadro como el siguiente
Lo interesante de esto es que uno podr controlar que visualizar, en que orden,
formato, tipo de columna y adems todo desde un entorno visual
La idea de estos dilogos es definir rpidamente las columnas mediante la opcin
de Add Column para luego pasar a la edicin mediante Edit Columns y
especificar propiedades que son importantes para que todo funcione.
Una de las propiedades importantes es DataPropertyName, esta es fundamental
para indicar que campo del origen de datos ser asignado a esa columna. Al
momento de cargar la grilla el valor de esa propiedad ser tomado del origen de
datos y asea un DataTable, o List<>, o cualquier otro que sea asignado y se
mapear con la columna usando esta propiedad.
Sino se asigna informacin a la propiedad DataPropertyName ese campo no cargara
datos alguno, lo cual puede ser interesante para campos calculados como veremos
en ejemplo mas adelante.
Es importante adems que la propiedad AutoGenerateColumns sea establecida en
false cuando se definan las columnas en tiempo de diseo, ya que en caso de no
hacerlo se aadir a la grilla las columnas generadas en runtime, lo cual no es
deseable en este caso.
2 Asignacin de los datos a la columna DataGridViewComboBoxColumn
Empezaremos por cargar la informacin en un ejemplo simple, en este solo se
tendr un nico campo del tipo combobox en el columna del DataGridView.
En este caso se trata de una grilla de producto con sus precios unitarios, adems
cada producto pertenece a una marca especifica, que podr seleccionarse entre las
disponibles por el sistema.
Los pasos a seguir sern:
- se recuperara la columna que fue definida del tipo combobox a la cual se le
asignaran los datos a desplegar, en este caso sern las Marcas disponibles.
- y por ultimo se cargara la grilla con los datos de los Productos.
El formulario que visualizara ser el siguiente:
La carga de los datos se ha realizado en el evento Load del formulario
[Link] void Form1_Load(object sender, EventArgs e)
02.{
03.//
04.// Asigno los datos del combo de marcas
05.//
[Link] comboboxColumn =
[Link]["Marca"] as DataGridViewComboBoxColumn;
07.
[Link] = [Link]();
[Link] = "Descripcion";
[Link] = "IdMarca";
11.
12.//
13.// bindeo los datos de los productos a la grilla
14.//
[Link] = false;
[Link] = [Link]();
17.
18.}
Es interesante notar que la primer parte se recupera la columna del DataGridView
que define el combobox, la cual se programa como si se tratara de un combobox
normal de .net, utilizando las propiedades DataSource, a la cual se le asignado el
origen de datos con la lista de Marcas, el DisplayMember y ValueMember, para
asignar que campo de la lista de Marcas ser visible al usuario y cual ser el id de
cada tem listado.
El segunda parte carga los datos del DataGridView, tomando todos los producto a
mostrar en la grilla.
Adems se especifica la propiedad AutoGenerateColumns definiendo que solo las
columnas creadas en tiempo de diseo sern las visibles.
A continuacin se visualizara los mtodo utilizados para cargar los datos en el
DataGridView
[Link] static List<MarcaEntity> GetAllMarca()
02.{
[Link] sql = @"SELECT IdMarca
04.,Descripcion
[Link] Marcas";
06.
[Link]<MarcaEntity> list = new List<MarcaEntity>();
08.
[Link] (OleDbConnection conn
= new OleDbConnection([Link]["default"]
.ToString()))
10.{
11.
[Link] command = new OleDbCommand(sql, conn);
13.
[Link]();
15.
[Link] reader = [Link]();
17.
[Link] ([Link]())
19.{
[Link](LoadMarca(reader));
21.}
22.
[Link] list;
24.}
25.}
26.
[Link] static MarcaEntity LoadMarca(IDataReader reader)
28.{
[Link] marca = new MarcaEntity();
30.
[Link] = Convert.ToInt32(reader["IdMarca"]);
[Link] = [Link](reader["Descripcion"]);
33.
[Link] marca;
35.}
[Link] static List<ProductoEntity> GetAllProductos()
02.{
[Link] sql = @"SELECT [IdProducto]
04.,[IdMarca]
05.,[Descripcion]
06.,[PrecioUnitario]
[Link] Productos";
08.
[Link]<ProductoEntity> list = new List<ProductoEntity>();
10.
[Link] (OleDbConnection conn
= new OleDbConnection([Link]["default"]
.ToString()))
12.{
13.
[Link] command = new OleDbCommand(sql, conn);
15.
[Link]();
17.
[Link] reader = [Link]();
19.
[Link] ([Link]())
21.{
[Link](LoadProducto(reader));
23.}
24.
[Link] list;
26.}
27.
28.
29.}
30.
[Link] static ProductoEntity LoadProducto(IDataReader reader)
32.{
[Link] producto = new ProductoEntity();
34.
[Link] = Convert.ToInt32(reader["IdProducto"]);
36.
[Link] = Convert.ToInt32(reader["IdMarca"]);
[Link] = [Link](reader["Descripcion"]);
39.
[Link] =
[Link](reader["PrecioUnitario"]);
41.
[Link] producto;
43.}
[C#]
[[Link]]
3 Realizar una operacin al cambiar la seleccin del combo
En este seccin se analizara como poder trabajar con un combobox que ha sido
agregado a la grilla.
En este ejemplo se agrego un atributo nuevo al producto, referido a un descuento,
segn el el valor seleccionado del combo se realizara una operacin con el mismo y
el valor calculado ser presentado en otra celda de la misma fila en donde se
visualiza la informacin del producto.
El formulario ahora tomara la siguiente forma
Adems si se analiza las propiedades de la nueva columna se podr apreciar que la
propiedad DataPropertyName se le ha especificado el nombre del campo de la tabla
de productos, y es el mismo nombre de la propiedad en la clase ProductoEntity.
A diferencia el ejemplo anterior en este solo se agregaron las lnea para cargar los
tems de descuento
[Link] void Form1_Load(object sender, EventArgs e)
02.{
03.//
04.// Asigno los datos del combo de marcas
05.//
[Link] comboboxColumn =
[Link]["Marca"] as DataGridViewComboBoxColumn;
07.
[Link] = [Link]();
[Link] = "Descripcion";
[Link] = "IdMarca";
11.
12.//
13.// Asigno los datos del combo de descuentos
14.//
[Link] dgccomboDescuento =
[Link]["Descuento"] as DataGridViewComboBoxColumn;
16.
[Link] = [Link]();
[Link] = "Descripcion";
[Link] = "IdDescuento";
20.
21.//
22.// bindeo los datos de los productos a la grilla
23.//
[Link] = false;
[Link] = [Link]();
26.
27.}
Pero lo mas importante es ver como se trabaja con el combo, detectando un cambio
en el tem y realizando el calculo del descuento.
[Link] void dataGridView1_CellValueChanged(object sender,
DataGridViewCellEventArgs e)
02.{
03.
[Link] ([Link][[Link]].Name == "Descuento")
05.{
06.//
07.// se obtiene el valor seleccionado en el combo
08.//
[Link] combo =
[Link][[Link]].Cells[[Link]] as DataGridViewComb
oBoxCell;
10.
[Link] idDescuento = Convert.ToInt32([Link]);
12.
13.//
14.// se recupera por el id la info del descuento
15.//
[Link] descuento =
[Link](idDescuento);
17.
18.//
19.// se calcula el descuento
20.//
[Link] cellPrecioUnitario =
[Link][[Link]].Cells["Precio"];
[Link] cellPrecioFinal =
[Link][[Link]].Cells["PrecioFinal"];
23.
[Link] valordescontar = ([Link] *
[Link]([Link])) / 100;
25.
[Link] = [Link]([Link])
- valordescontar;
27.}
28.}
En este caso se hizo uso del evento CellValueChange, y dentro de este se
realizando las operaciones para trabajar con el valor seleccionado del combo.
- Primeramente se valida que siempre se trabaje con la columna que uno quiere
operar, en este caso por el nombre se valida que sea la definida para el descuento.
Debe recordarse que estos eventos tambin puede disparase para la edicin de
otras celdas para las dems columnas. Pero en este caso como el calculo solo
interesa hacerlo en la columna de descuento es esta la verificada.
- Como segundo pasos se toma el id del descuento seleccionado en el combo, debe
recordarse que al momento de cargar los tems del combo, fueron los id los que se
unieron a la propiedad ValueMember.
- Con el id del descuento se accede a la base de datos para recuperar la entidad del
descuento y con esta el valor del porcentaje que ser usado en el calculo
- Por ultimo se recuperas la informacin de las celdas que restan y se procede a
realizar el calculo del porcentaje que ser desplegado en la ultima columna de la
grilla.
Algo interesante a notar es que esta ultima columna que se hace llamar Precio
Final no tiene valor alguno en la propiedad DataPropertyName, es por ello que no
se carga ningn valor proveniente de la base de datos.
[C#]
[[Link]]
Publicado por Leandro Tuttini en 10:55
Etiquetas: C#, DataGridView, [Link]
Primeros Pasos: Enlazar un
DataGridView y TextBox
en C#
Posted on November 2, 2010
En este tutorial vamos a aprender a enlazar un DataGridView con los
TextBox, las herramientas que vamos a utilizar para este tutorial son las
siguientes:
Microsoft
Visual
Studio
Professional
Express,
Puedes
bajar
la versin Express Aqu.
Microsoft SQL Server Express, Descargarlo desde Aqu.
En este caso utilizaremos la versin 2010, pero este ejemplo tambin te
puede servir si tienes la versin 2008 o 2005 y el lenguaje ser C#.
Que vamos aprender en este Tutorial?
1.
Crear una base de datos en SQL Server.
2.
Crear una conexin a la base de datos.
3.
Enlazar un TextBox con un DataGridView.
Empecemos con el Tutorial:
Paso 1: Creamos un nuevo proyecto del tipo Windows Forms Application
y lo nombramos DataGridView
Paso 2: Creamos un nuevo Item o elemento.
Paso 3: Al agregar un nuevo item nos mostrara una pantalla como la que
veremos a continuacin y buscaremos Service-base-Database y damos
click en Add, con esto estaremos creando la base de datos.
Paso
4:
Seleccionaras
la opcin de
DataSet
oprimes
siguiente,
te aparecer un mensaje de que haz creado un nuevo dataset y das
finalizar.
Paso 5: Vamos al explorador de soluciones que se encuentra de lado
derecho y encontraremos que se ha agregado una nueva base de datos
la cual lleva el nombre de [Link] , le damos doble click a la
base de datos y nos mostrara de lado izquierdo el Server Explorer donde
vamos a ver varias carpetas, vamos a dar un click derecho sobre la
carpeta de Tables o Tablas y seleccionamos la opcin de agregar nueva
tabla.
Paso 6: Vamos agregar los siguientes campos a nuestra tabla:
Id (int)
Nombre (varchar(50))
Telefono (int)
Direccion (varchar(50))
Email (varchar(50))
Una vez creados los campos, guardamos nuestra tabla con el nombre de
Empleados.
Paso 7: Ahora vamos a agregar algunos registros, en el Server Explorer
se agrego la tabla empleados, damos click derecho sobre la tabla y
seleccionamos la opcin de mostrar datos de la tabla o Show Table Data,
nos mostrara la tabla vaca proseguimos con agregar algunos registros.
Paso 8: Agregamos a nuestro formulario los siguientes controles:
1 DataGridView
6 Labels
5 TextBox
Nuestro Form deber quedar similar a la siguiente imagen.
Paso 9: !Vayamos al cdigo!
Lo
primero
que
vamos
hacer
es
importar
el
namespace: using [Link].
En la seccin de form_load agregaremos las siguientes lineas de cdigo.
BindingSource bindingsource1 = new BindingSource();
SqlDataAdapter dataAdapter = new SqlDataAdapter();
La primer linea nos servira como enlace de los datos de la tabla con el
datagridview
La segunda linea nos permitira poder unir nuestra consulta y la conexion.
Hasta Aqu debemos tener algo similar a esto:
Posteriormente vamos a copiar la ruta o path de nuestra base de datos,
vamos a nuestro explorador de soluciones y seleccionamos nuestra base
de datos [Link] para ver las propiedades de la base de datos,
una vez ya en las propiedades buscaremos la propiedad Full Path o
Ruta de Acceso, seleccionamos toda la ruta y copiamos.
Volvemos al cdigo y comenzamos a crear la conexin.
String
datasource=@Data
Source=.\SQLEXPRESS;AttachDbFilename=Aqu va la ruta
que copiamos anteriormente;Integrated Security=True;User
Instance=True;
//Aqu estamos definiendo la ruta de
nuestra base de datos
dataAdapter
Empleados,
new
SqlDataAdapter(Select
datasource);
nuestra base de datos
SqlCommandBuilder
//Enlazamos
la
comando
SqlCommandBuilder(dataAdapter);
from
consulta
=
con
new
//Generamos
un
comando para asociarlo con nuestro dataAdapter
DataTable tabla = new DataTable();// Creamos un objeto
DataTable
[Link](tabla);//Llenamos nuestro dataAdapter con
los campos de nuestra tabla
[Link] = tabla;//Asignamos la fuente
de datos de nuestro bindingsource
[Link]
=
asignamos el datasource a nuestro DataGridView
[Link](Text,
bindingsource1,
Id);//Enlazamos
nuestros
campos
bindingsource1;//Le
de
texto
con
el
bindingsource y sus respectivos campos.
[Link](Text,
bindingsource1,
Nombre);
[Link](Text,
bindingsource1,
Telefono);
[Link](Text,
bindingsource1,
Direccion);
[Link](Text,
bindingsource1,
Email);
Al terminar tendremos un cdigo como se muestra en la siguiente
imagen.
Ahora solo ejecutamos nuestro proyecto y listo, tenemos nuestro
DataGridView enlazado con los Textbox, como resultado tendremos que
al
seleccionar
un
registro
en
el
DataGridView
texto tendrn el valor del registro seleccionado.
Espero y les pueda servir este tutorial :)
los
campos
de