Como puedo vaciar el contenido de un datagridview? Hace unos dias que lo estoy probando pero no hay manera. Resulta que tengo tengo un datagridview, datagridview, donde le asigno como datasource un dataset con datos, y luego le asigno el datamember, y me muestra los datos. Hasta aquí ningun problema. El problema viene cuando quiero vaciar este datagridview porque simplemente simplemente no quiero mostrar ninguna informacin en !l, vamos, que lo quiero vaciar. He probado asignandole el datasource a null, pero visualmente el datagridview sigue con datos. "ambien he probado con la funcion Clear#$ pero tampoco. %ue hago mal? &tra forma de vaciarlo, al menos en c' es( )ata*rid+iew.Rows.Clear#$-
C OL OR E A RC E L DA SDEUNDA T A GR I DVI E W
upongamos que tenemos un control de tipo DataGridView que tiene tres columnas visibles. Con el siguiente m!todo vamos a poder pintar de un color determinado el fondo de una /la determinada. 0os argumentos que recibe el m!todo son( •
DataGridView visor
( El visor del que deseamos pintar el fondo de una de
sus líneas •
Int32 fila
•
Color c
( El n1mero de la /la que deseamos pintar el fondo
( El color del que vamos a pintar el fondo de la /la
+e2mos el cdigo del m!todo( private void gestionaResaltados#)ata*rid+iew visor, 3nt45 /la, ystem.)rawing.Color c$ 6 visor.Rows7/la8.Cells798.tyle.:ac;Color visor .Rows7/la8.Cells798.tyle.:ac;Color < cvisor.Rows7/la8.Cells78.tyle.:ac;Color visor .Rows7/la8.Cells78.tyle.:ac;Color < cvisor.Rows7/la8.Cells758.tyle.:ac;Color visor .Rows7/la8.Cells758.tyle.:ac;Color < c=
DataGridView: posicionar scroll Esta es una cuestión muy simple y sencilla pero me ha parecido correcto incluirla en un post porque es de ese tipo de cosas que siempre se preguntan y nadie escribe sobre ello porque parece demasiado trivial.
Supongamos el caso de un DataGridView que contiene multitud de líneas y el usuario se desplaa por el mismo con un scroll vertical. En un momento dado el usuario cambia el contenido de una celda y actualia para que los cambios sean volcados en la base de datos que alimenta el DataGridView. !"u# ocurre$. "ue al actualiar el scroll sube a la parte de arriba% perdiendo de vista en la pantalla el cambio e&ectuado. 'a solución es la siguiente:
int indiceFilaSelec = dataGridView1.CurrentRow.Index ; dataGridView1.FirstDisplayedScrollingRowIndex = indiceFilaSel ec; ec; (ambi#n se puede obtener el índice de la &ila seleccionada (ambi#n con dataGridView1.SelectedRows[0].Index;
Colocar un >ncho i@o a una Columna de un datagridview en visual C' 599A Buede ser así ( private void ormarto*rilla ormarto*rilla#$ #$ 6 dgvBersona. dgvBersona.Columns Columns7798. 8.idth idth < D9 D9- dgvBersona. dgvBersona.Columns Columns778. 8.idth idth < 9 9-= 0uego ( private void void frmClienteF0oad frmClienteF0oad##ob@ect ob@ect sender sender,, Event>rgs Event>rgs e e$$ 6 dgvBersona. dgvBersona.)ataource < Bersona Bersona..Cargar*rilla Cargar*rilla#$#$ormarto*rilla#$ormarto*rilla #$=
Supongamos el caso de un DataGridView que contiene multitud de líneas y el usuario se desplaa por el mismo con un scroll vertical. En un momento dado el usuario cambia el contenido de una celda y actualia para que los cambios sean volcados en la base de datos que alimenta el DataGridView. !"u# ocurre$. "ue al actualiar el scroll sube a la parte de arriba% perdiendo de vista en la pantalla el cambio e&ectuado. 'a solución es la siguiente:
int indiceFilaSelec = dataGridView1.CurrentRow.Index ; dataGridView1.FirstDisplayedScrollingRowIndex = indiceFilaSel ec; ec; (ambi#n se puede obtener el índice de la &ila seleccionada (ambi#n con dataGridView1.SelectedRows[0].Index;
Colocar un >ncho i@o a una Columna de un datagridview en visual C' 599A Buede ser así ( private void ormarto*rilla ormarto*rilla#$ #$ 6 dgvBersona. dgvBersona.Columns Columns7798. 8.idth idth < D9 D9- dgvBersona. dgvBersona.Columns Columns778. 8.idth idth < 9 9-= 0uego ( private void void frmClienteF0oad frmClienteF0oad##ob@ect ob@ect sender sender,, Event>rgs Event>rgs e e$$ 6 dgvBersona. dgvBersona.)ataource < Bersona Bersona..Cargar*rilla Cargar*rilla#$#$ormarto*rilla#$ormarto*rilla #$=
Bedro Gvila El hombre sabio querr2 estar siempre con quien sea me@or que !l. 0ima I Ber1
martes% ) de *unio de +,),
[DataGridView] – Texto Celdas en Mayúscula Introducción En algunos casos es necesario que la entrada de datos sea siempre en may-scula% lograr esto en un control (etbo (etbo es relativamente simple% ya que se dispone del evento /ey0ress para detectar y convertir el valor ingresado. 0ero que sucede si esto mismo se quiere aplicar ap licar a las celdas de un DataGridView% DataGridView% bien este articulo demuestra como poder lograrlo. Usando el evento EditinControl!"owin En el e*emplo se har1 uso del evento que permitir1 detecta cuando una celda entra en modo de edición. Dentro del evento Editing2ontrolShowing% Editing2ontrolShowing% se detecta si la columna que entro en modo de edición corresponde a la que se quiere controlar. En este e*emplo solo la columna 3Descripcion4 ser1 a&ectada con el control en el input de datos. Es necesario remarcar que al momento de ad*unta el evento /ey0ress al ob*eto e.2ontrol% 5que ha sido casteado a DataGridView(et DataGridView(et6oEditing2ontr 6oEditing2ontrol% ol% para su correcta utiliación7% el handler del evento se aplicaría a todas las celdas de este mismo tipo. (ambi#n (ambi#n a las de las columnas que no se quiere aplicar el control de may-sculas% may-sculas% en este caso la de 32uenta4. Es por eso que en el evento /ey0ress tambi#n se control la columna que esta activa en ese momento. El handler del evento queda ad*unto aun cuando se sale de modo edición. 'a utiliación de la primer línea que quita el hadler al entrar en edición:
d(et./ey0ress 89 new /ey0ressEventandler5d(et;/ey0ress7< Solo sirve para que se ad*unte un -nico evento% ya que sino estuviera se ad*untarían una detr1s de otro produci#ndose m-ltiples llamadas al evento /ey0ress. =2>?
private void dataGridView1!ditingControlS"owing#o$%ect sender& DataGridView!ditingControlS"owing!vent'rgs e( ) int colu*nIndex = dataGridView1.CurrentCell dataGridView1.CurrentCell.Colu*nIndex; .Colu*nIndex; i+ #dataGridView1.Colu*ns,colu*nIndex-.a*e #dataGridView1.Colu*ns,colu *nIndex-.a*e == /Descripcion/( ) DataGridView0extox!ditingControl DataGridView0extox!diting Control d0ext = #DataGridView0extox!ditingControl(e.Control; d0ext.2ey3ress 4= new 2ey3ress!vent5andler#d0ext 2ey3ress!vent5andler#d0ext2ey3ress(; 2ey3ress(; d0ext.2ey3ress 6= new 2ey3ress!vent5andler#d0ext2ey3ress(; 7 7 void d0ext2ey3ress#o$%ect sender& 2ey3ress!vent'rgs e( ) int colu*nIndex = dataGridView1.CurrentCell dataGridView1.CurrentCell.Colu*nIndex; .Colu*nIndex; i+ #dataGridView1.Colu*ns,colu*nIndex-.a*e #dataGridView1.Colu*ns,colu *nIndex-.a*e == /Descripcion/( ) e.2eyC"ar = c"ar.0o8pper#e.2eyC"ar(; 7 7 =V6.@E(?
3rivate Su$ dataGridView1!ditingControlS"owing#yVal sender 's 9$%ect& yVal e 's DataGridView!ditingControlS"owing!vent'rgs( Di* colu*nIndex 's Integer = dataGridView1.CurrentCel dataGridView1.CurrentCell.Colu*nIndex l.Colu*nIndex I+ dataGridView1.Colu*ns#colu* dataGridView1.Colu*ns#colu*nIndex(.a*e nIndex(.a*e = /Descripcion/ 0"en Di* d0ext 's DataGridView0extox!diting DataGridView0extox!ditingControl Control = DirectCast#e.Control& DataGridView0extox!ditingControl( Re*ove5andler d0ext.2ey3ress& 'ddress9+ d0ext2ey3ress 'dd5andler d0ext.2ey3ress& 'ddress9+ d0ext2ey3ress !nd I+ !nd Su$ 3rivate Su$ d0ext2ey3ress#yVal sender 's 9$%ect& yVal e 's 2ey3ress!vent'rgs(
Di* colu*nIndex 's Integer = dataGridView1.CurrentCel dataGridView1.CurrentCell.Colu*nIndex l.Colu*nIndex I+ dataGridView1.Colu*ns#colu* dataGridView1.Colu*ns#colu*nIndex(.a*e nIndex(.a*e = /Descripcion/ 0"en e.2eyC"ar = C"ar.0o8pper#e.2eyC"ar( !nd I+ !nd Su$
7C'8
7+:.JE"8
#esolución del $ro%le&a en al asinación del evento El problema comentado anteriormente podrías resolverse &1cilmente con solo declarar la variable que contendr1 la celda en edición de &orma global al evento. De esta &orma se podrías hacer uso del evento que detecta cuando u na celda ha de*ado de editarse% removiendo el handler del evento. Ahora el evento /ey0ress /ey0ress no controla controla que columna se esta esta editando% esto solo solo se hace cuando se entra o sale del modo edición de la celda. =2>?
DataGridView0extox!ditingControl d0ext = null; private void dataGridView1!ditingControlS"owing#o$%ect sender& DataGridView!ditingControlS"owing!vent'rgs e( ) int colu*nIndex = dataGridView1.CurrentCell dataGridView1.CurrentCell.Colu*nIndex; .Colu*nIndex; i+ #dataGridView1.Colu*ns,colu*nIndex-.a*e #dataGridView1.Colu*ns,colu *nIndex-.a*e == /Descripcion/( ) d0ext = #DataGridView0extox!diting #DataGridView0extox!ditingControl(e.Control; Control(e.Control; d0ext.2ey3ress 6= new 2ey3ress!vent5andler#d0ext2ey3ress(; 7 7 private void dataGridView1Cell!nd!dit#o$%ect sender& DataGridViewCell!vent'rgs e( ) int colu*nIndex = dataGridView1.CurrentCell dataGridView1.CurrentCell.Colu*nIndex; .Colu*nIndex; i+ #dataGridView1.Colu*ns,colu*nIndex-.a*e #dataGridView1.Colu*ns,colu *nIndex-.a*e == /Descripcion/( ) d0ext.2ey3ress 4= new 2ey3ress!vent5andler#d0ext 2ey3ress!vent5andler#d0ext2ey3ress(; 2ey3ress(; 7 7
void d0ext2ey3ress#o$%ect sender& 2ey3ress!vent'rgs e( ) e.2eyC"ar = c"ar.0o8pper#e.2eyC"ar(; 7 =V6.@E(?
3rivate d0ext 's DataGridView0extox!ditingControl = ot"ing 3rivate Su$ dataGridView1!ditingControlS"owing#yVal sender 's 9$%ect& yVal e 's DataGridView!ditingControlS"owing!vent'rgs( 5andles dataGridView1.!ditingControlS"owing Di* colu*nIndex 's Integer = dataGridView1.CurrentCell.Colu*nIndex I+ dataGridView1.Colu*ns#colu*nIndex(.a*e = /Descripcion/ 0"en d0ext = DirectCast#e.Control& DataGridView0extox!ditingControl( 'dd5andler d0ext.2ey3ress& 'ddress9+ d0ext2ey3ress !nd I+ !nd Su$ 3rivate Su$ dataGridView1Cell!nd!dit#yVal sender 's 9$%ect& yVal e 's DataGridViewCell!vent'rgs( 5andles dataGridView1.Cell!nd!dit Di* colu*nIndex 's Integer = dataGridView1.CurrentCell.Colu*nIndex I+ dataGridView1.Colu*ns#colu*nIndex(.a*e = /Descripcion/ 0"en Re*ove5andler d0ext.2ey3ress& 'ddress9+ d0ext2ey3ress !nd I+ !nd Su$ 3rivate Su$ d0ext2ey3ress#yVal sender 's 9$%ect& yVal e 's 2ey3ress!vent'rgs( e.2eyC"ar = C"ar.0o8pper#e.2eyC"ar( !nd Su$
7C'8
7+:.JE"8
0ublicado por 'eandro (uttini en ),:,+ B comentarios: Etiquetas: DataGridView
domingo% + de mayo de +,),
C' ( [DataGridView] DataGridViewCo&%o)oxColu&n – Variar contenido del co&%o%ox res$ecto a la *ila Introducción El ob*etivo del articulo es demostrar algunos problemas que pueden surgir cuando se necesita que el 2ombo6o ubicado en las celdas del DataGridView% varíe su contenido de acuerdo al registro que se visualia. 0ara demostrar el problema% se ha de&inido un dominio del e*emplo intentara cargar una grilla de sucursales% de los cuales mostraran el listado de los tel#&onos disponibles. 0or supuesto para cada sucursal los tel#&onos disponibles varían% por lo tanto de&inir el contenido del combo como una -nica lista no es posible. Cara del contenido varia%le en Co&%o)ox En el evento 'oad del &ormulario se procede a la carga de las sucursales% e inmediatamente despu#s de esta operación se invoca a un m#todo creado con el &in de la carga de los combos de cada registro de a grilla. Este m#todo recorre en un ciclo cada registro% toma el id de la sucursal que se encuentra en la celda del registro actual% y tambi#n toma la celda que representa el combo. 2on las anteriores dos selecciones procede a realiar una consulta a los datos y cargar en el combo los tel#&onos de esa sucursal.
private void +r*Sucursales:oad#o$%ect sender& !vent'rgs e( ) Sucursales!ntities sucursalesContext = new Sucursales!ntities#(;
dgvScursales.'utoGenerateColu*ns=+alse; dgvScursales.DataSource = sucursalesContext.Sucursales; :uego de $indear la grilla& cargo el contenido de cada +ila en el co*$o de tele+onos para cada sucursal :oadGrillaCo*$oox0ele+onos#(;
7 private void :oadGrillaCo*$oox0ele+onos#( )
+oreac" #DataGridViewRow row in dgvScursales.Rows( ) int idSucursal = Convert.0oInt<#row.Cells,/IdSucursal/-.Value(; DataGridViewCo*$ooxCell co*$o$oxCell = row.Cells,/0ele+onos/- as DataGridViewCo*$ooxCell; Sucursales!ntities sucursalesContext = new Sucursales!ntities#(; co*$o$oxCell.DataSource = sucursalesContext.0ele+onos.>"ere#x =? x.IdSucursal == idSucursal(; co*$o$oxCell.Value@e*$er = /Id/; co*$o$oxCell.Display@e*$er = /u*ero/; 7 7 +lunos Co&entarios Durante la realiación del e*emplo se realiaron varias pruebas% con algunos eventos que se adaptaran a la situación y evitaran tener que recorrer en un 3&oreach4 cada registro del DataGridView. Despu#s de investigar un poco los -nicos dos eventos que se adaptarían a este caso serian el CowsAdded y el 2ellormatting% pero ambos tra*eron problemas% lo que impidió su uso. El 2ellormatting% tiene como problema que se e*ecuta contantemente% ya que es lanado al redibu*ar la celda% y como esta operación requiere la consulta a los datos% generaba un e&ecto de bloqueo en la pantalla% el cual no es deseado. El CowsAdded% si bien se e*ecuta por cada &ila agregada en la o peración de bindeo de los datos% no había &orma interna en el evento de detectar que &ila se estaba agregando% ya que el argumento del evento e.Cownde o e.Cow2ount% no devuelven un valor correcto. 2omo conclusión se de*o de lado los eventos y se hio uso del 3&oreach4% implementado esto en un m#todo% cuya utiliación se realia luego que se bindearon los datos en el control.
7C'8
7+:.JE"8
0ublicado por 'eandro (uttini en +,:B) +F comentarios: Etiquetas: DataGridView% inorm
*ueves% ++ de abril de +,),
C' ( [DataGridView] – ,asar #eistros entre Grillas Introducción
El articulo eplica de que &orma se puede seleccionar registros en el control DataGridView y pasarlos a otro% representando este la selección de las &ilas por el usuario. En uno de los DataGridView se listaran productos% y por medio de un checHbo en cada &ila% se podr1 seleccionar que ítems se desean seleccionar. 6otones que indican la dirección ser1n los encargados de e*ecutar la opción de pasa*e. El diseIo de la inter&a puede apreciarse en esta imagen:
Cara de la lista de $roductos
0ara esta operación se requerir1 la ayuda del DataSet tipado el cual de&ine la estructura de la entidad% pero ser1 responsabilidad de la clase con su&i*o DA'% la que cargara la in&ormación% proveniente de la base de datos.
private void +r*3edidos:oad#o$%ect sender& !vent'rgs e( ) Se recupera los datos de los productos desde la ta$la dto3roductos datos = 3roductoD':.3roductosGet'll#(; Se $indean los datos a la grilla dgv3roductos.'utoGenerateColu*ns = +alse; dgv3roductos.DataSource = datos; dgv3roductos.Data@e*$er = /3roductos/; 7 !elección de un -te& en la rilla de orien
ay que destacar que la operación sobre un DataGridView di&iere si esta se encuentra previamente enlaada a datos% o no. En esta primera operación implica la sección de un producto que pasara a una lista no enlaada a datos% por lo tanto se podr1 hacer uso de m#todo Add57 de la colección de Cows de la grilla.
private void $tnSeleccionarClicA#o$%ect sender& !vent'rgs e( ) Se de+ine una lista te*poral de registro seleccionados :istBDataGridViewRow? rowSelected = new :istBDataGridViewRow?#(; Se recorre ca registro de la grilla de origen +oreac" #DataGridViewRow row in dgv3roductos.Rows( ) Se recupera el ca*po ue representa el c"ecA$ox& y se valida la seleccion agregandola a la lista te*poral DataGridViewC"ecAoxCell cellSelecion = row.Cells,/Seleccion/- as DataGridViewC"ecAoxCell; i+ #Convert.0ooolean#cellSelecion.Value(( ) rowSelected.'dd#row(; 7
7
Se agrega el ite* seleccionado a la grilla de destino eli*inando la +ila de la grilla original +oreac" #DataGridViewRow row in rowSelected( ) dgvSeleccion.Rows.'dd#new o$%ect,- )+alse& row.Cells,/Descripcion/-.Value& row.Cells,/3recio8nitario/-.Value& row.Cells,/8nidad@edida/-.Value7(;
dgv3roductos.Rows.Re*ove#row(; 7
7 ay que remarcar tambi#n que el uso de la lista temporal no es un capricho% sino que es necesaria ya que mientras se recorre una lista por medio de la instrucción 3&or each4% no pueden removerse elementos. 0or esta raón es que en una operación siguiente se recorre la selección y allí si se procede a incluye los ítems en al grilla de destino y quitarla de la original.
Este punto lo he eplicado con mas detalle siguiente articulo: Eliminar ítems en una lista
!elección de un -te& en la rilla de destino
Ahora le toca el turno a la operación contraria% y aquí hay un punto que ya se menciono en el paso previo% la lista de origen esta vinculada a datos de productos con lo cual usar e l Cows.Add57 no es posible. 0ara esta operación se agregaran los datos directo en el origen% en este caso el datatable% que se ha creado dentro del DataSet tipado.
private void $tnuitarClicA#o$%ect sender& !vent'rgs e( ) Se de+ine una lista te*poral de registro seleccionados :istBDataGridViewRow? rowSelected = new :istBDataGridViewRow?#(; Se recorre cada +ila de la grilla de seleccion y se deter*ian ue registros estan c"ecAeados +oreac" #DataGridViewRow row in dgvSeleccion.Rows( ) DataGridViewC"ecAoxCell cellSelecion = row.Cells,/SeleccionSel/as DataGridViewC"ecAoxCell; i+ #Convert.0ooolean#cellSelecion.Value(( ) rowSelected.'dd#row(; 7
7
Se valida si "ay algun registro por eli*inar i+ #rowSelected.Count ? E( ) Se recupera el origen de datos ue tiene asignada la grilla de productos dto3roductos datos = dgv3roductos.DataSource as dto3roductos; Se recorre cada ite* seleccionado y se ar*a progra*atica*ente la +ila del Data0a$le se eli*ina el registro de la grilla de selecciones
+oreac" #DataGridViewRow row in rowSelected( ) dto3roductos.3roductosRow productoRow = datos.3roductos.ew3roductosRow#(; productoRow.Descripcion = Convert.0oString#row.Cells,/DescripcionSel/-.Value(; productoRow.3recio8nitario = Convert.0oDeci*al#row.Cells,/3recio8nitarioSel/-.Value(; productoRow.8nidad@edida = Convert.0oString#row.Cells,/8nidad@edidaSel/-.Value(; datos.3roductos.Rows.'dd#productoRow(;
dgvSeleccion.Rows.Re*ove#row(; 7
Se $inden los datos nueva*ente& pero a"ora con los nuevos registros agregados del paso anterior dgv3roductos.'utoGenerateColu*ns = +alse; dgv3roductos.DataSource = datos; dgv3roductos.Data@e*$er = /3roductos/; 7 7 Es necesario analiar como toma los datos originales convirtiendo el contenido de DataSource de la grilla% en este caso a dto0roductos% ya que este es el tipo de datos utiliado en al carga original. Se toman los datos originales% se procede a la creación de cada row de &orma program1tica% asignando el valor a cada campo% por ultimo se vuelve a bindear la g rilla.
7C'8
7+:.JE"8
0ublicado por 'eandro (uttini en J:KL ))L comentarios: Etiquetas: DataGridView
*ueves% )F de abril de +,),
C' ( [DataGridView] – Uso del C"ec.)ox ( DataGridViewC"ec.)oxColu&n Introducción El articulo intentara mostrar las algunas &orma en que se puede utiliar el checHbo en un control DataGridView. Detectar el ca&%io en la selección
0ara realiar la tarea se har1 uso de dos eventos que pueden ser igual de -tiles% el 2ellValue2hange y el 2ell2ontent2licH De &orma est1ndar el 2ellValue2hange% se deparar1 a seleccionar el checH de la celda y quitar el &oco de la misma% saliendo del modo de edición. 0ero este no e*ecuta la acción en el mismo instante en que se origina% sino que hay que salir de la edición de la celda para que el evento ocurra.
private void dataGridView1CellValueC"anged#o$%ect sender& DataGridViewCell!vent'rgs e( ) Solo se tra$a%a ante los ca*$ios en la colu*an de los c"ecA$ox i+ #dataGridView1.Colu*ns,e.Colu*nIndex-.a*e == /Seleccion/( ) Se to*a la +ila seleccionada DataGridViewRow row = dataGridView1.Rows,e.RowIndex-; Se selecciona la celda del c"ecA$ox DataGridViewC"ecAoxCell cellSelecion = row.Cells,/Seleccion/- as DataGridViewC"ecAoxCell; Se valida si esta c"ecAeada i+ #Convert.0ooolean#cellSelecion.Value(( ) string *ensa%e = string.For*at#/!vento CellValueC"anged.nnSe "a seccionado& nDescripcion H)E7H& n3recio 8nitario H)17H& n@edida H)7H/& row.Cells,/Descripcion/-.Value& row.Cells,/3recio8nitario/-.Value& row.Cells,/8nidad@edida/-.Value(; @essageox.S"ow#*ensa%e& //& @essageoxuttons.92& @essageoxIcon.In+or*ation(; 7 7 7 2on respecto al 2ell2ontent2licH% que si e*ecuta la acción en el mismo momento en que el usuario marca% o desmarca% el checHbo% pero me encontr# que solo devolvía null en la propiedad Value de la celda.
private void dataGridView1CellContentClicA#o$%ect sender& DataGridViewCell!vent'rgs e( ) Detecta si se "a seleccionado el "eader de la grilla i+ #e.RowIndex == 41( return; i+ #dataGridView1.Colu*ns,e.Colu*nIndex-.a*e == /Seleccion/( ) Se to*a la +ila seleccionada DataGridViewRow row = dataGridView1.Rows,e.RowIndex-; Se selecciona la celda del c"ecA$ox DataGridViewC"ecAoxCell cellSelecion = row.Cells,/Seleccion/- as DataGridViewC"ecAoxCell; i+ #Convert.0ooolean#cellSelecion.Value(( ) string *ensa%e = string.For*at#/!vento CellContentClicA.nnSe "a seccionado& nDescripcion H)E7H& n3recio 8nitario H)17H& n@edida H)7H/& row.Cells,/Descripcion/-.Value& row.Cells,/3recio8nitario/-.Value& row.Cells,/8nidad@edida/-.Value(; @essageox.S"ow#*ensa%e& //& @essageoxuttons.92& @essageoxIcon.In+or*ation(;
7 else )
string *ensa%e = string.For*at#/!vento CellContentClicA.nnSe "a uitado la seleccion& nDescripcion H)E7H& n3recio 8nitario H)17H& n@edida H)7H/& row.Cells,/Descripcion/-.Value& row.Cells,/3recio8nitario/-.Value& row.Cells,/8nidad@edida/-.Value(; @essageox.S"ow#*ensa%e& //& @essageoxuttons.92& @essageoxIcon.In+or*ation(; 7
7 7 (ambi#n se ha intentado hacer uso del evento Editing2ontrolShowing% el cual permitiría detectar la selección en el mismo momento que el usuario realia la acción% pero esto no &ue posible ya que este tipo de columna no provoca el evento necesario para tomar el control 2hecH6o y asignar el evento Selectednde2hanged. Ante este problema con los eventos% y notar que ninguno responde como debería% se encontró un m#todo que resolvió todos los problemas de un solo golpe% se trata del 2ommitEdit
private void dataGridView1CurrentCellDirtyStateC"anged#o$%ect sender& !vent'rgs e( ) i+ #dataGridView1.IsCurrentCellDirty( ) dataGridView1.Co**it!dit#DataGridViewData!rrorContexts.Co**it(; 7 7 En el evento 2urrent2ellDirtyState2hanged% se detecta si la grilla esta con alg-n cambio pendiente% y en caso de estarlo se hace un 2ommit del mismo para re&le*ar el valor en los eventos que lo usaran. Esto arregla los dos problemas detectados anteriormente: 8 se lana el evento 2ellValue2hanged% sin tener que quitar el &oco de la celda 8 ya no se recibe el null en el Value de la celda% en el evento 2ell2ontent2licH
7C'8
7+:.JE"8
+$licar *or&ato a la selección (eniendo en cuenta lo contado en la sección anterior% aplicar un &ormato a la &ila seleccionada no debería ser un misterio.
private void dataGridView1CellContentClicA#o$%ect sender& DataGridViewCell!vent'rgs e( ) Detecta si se "a seleccionado el "eader de la grilla i+ #e.RowIndex == 41( return; i+ #dataGridView1.Colu*ns,e.Colu*nIndex-.a*e == /Seleccion/( ) Se to*a la +ila seleccionada DataGridViewRow row = dataGridView1.Rows,e.RowIndex-; Se selecciona la celda del c"ecA$ox
DataGridViewC"ecAoxCell cellSelecion = row.Cells,/Seleccion/- as DataGridViewC"ecAoxCell; i+ #Convert.0ooolean#cellSelecion.Value(( row.De+aultCellStyle.acAColor = Color.Green; else row.De+aultCellStyle.acAColor = Color.>"ite; 7 7 private void dataGridView1CurrentCellDirtyStateC"anged#o$%ect sender& !vent'rgs e( ) i+ #dataGridView1.IsCurrentCellDirty( ) dataGridView1.Co**it!dit#DataGridViewData!rrorContexts.Co**it(; 7 7 Simplemente ante la detección de la selección del usuario se cambia el color de la &ila usando el De&ault2ellStyle.6acH2olor.
7C'8
7+:.JE"8
0ublicado por 'eandro (uttini en F:FM LM comentarios: Etiquetas: DataGridView% inorm
*ueves% ) de abril de +,),
C' ( [/in*or&s] !eleccionar 0ila con E1TE# – DataGridView y 2istView Introducción Este articulo es mostrara una alternativa de como se puede detectar la presión de una tecla 5en este caso el E@(EC7 en un control determinado% pudiendo así traba*ar con la selección. En el e*emplo se traba*ar con dos controles% el DataGridView y un 'istView. 61sicamente la t#cnica para ambos e*emplos ser1 similar% todo el traba*o se realiaría en el m#todo 0rocess2md/ey del &ormulario% 5el cual es una sobrecarga7% permitiendo atrapar la teclas pulsadas en el &ormulario% en este adem1s se podrías validar que control esta activo en ese momento y en caso de ser el que resulta -til% procede a traba*ar con la selección. 0ara ambos e*emplo se permitir1 optar 5mediante radiobuttons7 si la selección del ítem en la lista se mostrar en un mensa*e% o ser1 desplegado en otra ventana 5&ormulario7.
DataGridView ( !elección de la *ila
2omo había comentado todo el traba*o esta en la &unción: =2>?
protected override $ool 3rocessC*d2ey#re+ Syste*.>indows.For*s.@essage *sg& Syste*.>indows.For*s.2eys AeyData( ) Si el control DataGridView no tiene el +oco& se a$andona*os el procedi*iento& lla*ando al *etodo $ase i+ ##dataGridView1.Focused(( return $ase.3rocessC*d2ey#re+ *sg& AeyData(; Si la tecla presionada es distinta al !0!R& se a$andona*os el procedi*iento& lla*ando al *etodo $ase i+ #AeyData = 2eys.!nter( return $ase.3rocessC*d2ey#re+ *sg& AeyData(; 9$tene*os la +ila actual DataGridViewRow row = dataGridView1.CurrentRow; i+ #r$@ostrar@ensa%e.C"ecAed( ) @essageox.S"ow#string.For*at#/Se "a seleccionado& CuentaH)E7H DescripcionH)17H/& row.Cells,/cuenta/-.Value& row.Cells,/descripcion/-.Value((; 7 else i+ #r$@ostrarFor*.C"ecAed( ) int cuenta = Convert.0oInt<#row.Cells,/cuenta/-.Value(; string desc = Convert.0oString#row.Cells,/descripcion/-.Value(; +r*Seleccion +r* = new +r*Seleccion#cuenta& desc(; +r*.S"owDialog#(;
7
return true; 7 =V6.@E(?
3rotected 9verloads 9verrides Function 3rocessC*d2ey#yRe+ *sg 's Syste*.>indows.For*s.@essage& AeyData 's Syste*.>indows.For*s.2eys( 's oolean H H Si el control DataGridView no tiene el +oco& H se a$andona*os el procedi*iento& lla*ando al *etodo $ase H I+ #ot dataGridView1.Focused( 0"en Return @yase.3rocessC*d2ey#*sg& AeyData( !nd I+
H H Si la tecla presionada es distinta al !0!R& H se a$andona*os el procedi*iento& lla*ando al *etodo $ase H I+ AeyData B? 2eys.!nter 0"en Return @yase.3rocessC*d2ey#*sg& AeyData( !nd I+ H H 9$tene*os la +ila actual H Di* row 's DataGridViewRow = dataGridView1.CurrentRow I+ r$@ostrar@ensa%e.C"ecAed 0"en @essageox.S"ow#String.For*at#/Se "a seleccionado& CuentaH)E7H DescripcionH)17H/& row.Cells#/cuenta/(.Value& row.Cells#/descripcion/(.Value(( !lseI+ r$@ostrarFor*.C"ecAed 0"en Di* cuenta 's Integer = CInt#row.Cells#/cuenta/(.Value( Di* desc 's String = CStr#row.Cells#/descripcion/(.Value(
Di* +r* 's ew +r*Seleccion#cuenta& desc( +r*.S"owDialog#( !nd I+
Return 0rue !nd Function 8 El primer punto es detectar si al presionar la tecla el &oco lo tiene el control que se quiere traba*ar% en este caso el DataGridView 8 El segundo paso es determinar si la tecla presionada por el usuario es la que se desea controlar% en este caso ser1 el E@(EC Si las dos validaciones anteriores pasaron% se puede recuperar la &ila seleccionada en la grilla% y traba*ar con la in&ormación que esta proporcione.
7C'8
7+:.JE"8
2istView – !elección de la *ila 'a -nica di&erencia entre este código y el usado en el DataGridview% ser1 la &orma en que se obtiene el ítem seleccionado. 'as validaciones en cuanto a la tecla presionada% y el &oco en e l control activo son id#nticas para ambos casos.
=2>?
protected override $ool 3rocessC*d2ey#re+ Syste*.>indows.For*s.@essage *sg& Syste*.>indows.For*s.2eys AeyData( ) Si el control DataGridView no tiene el +oco& se a$andona*os el procedi*iento& lla*ando al *etodo $ase i+ ##listView1.Focused(( return $ase.3rocessC*d2ey#re+ *sg& AeyData(; Si la tecla presionada es distinta al !0!R& se a$andona*os el procedi*iento& lla*ando al *etodo $ase i+ #AeyData = 2eys.!nter( return $ase.3rocessC*d2ey#re+ *sg& AeyData(; Sino "ay ite* seleccinado en la lista se a$andona*os el procedi*iento& lla*ando al *etodo $ase i+#listView1.SelectedIte*s.Count == E( return $ase.3rocessC*d2ey#re+ *sg& AeyData(; 9$tene*os la +ila actual :istViewIte* ite* = listView1.SelectedIte*s,E-; i+ #r$@ostrar@ensa%e.C"ecAed( ) @essageox.S"ow#string.For*at#/Se "a seleccionado& CuentaH)E7H DescripcionH)17H/& ite*.0ext& ite*.Su$Ite*s,1-.0ext((; 7 else i+ #r$@ostrarFor*.C"ecAed( ) int cuenta = Convert.0oInt<#ite*.0ext(; string desc = Convert.0oString#ite*.Su$Ite*s,1-.0ext(; +r*Seleccion +r* = new +r*Seleccion#cuenta& desc(; +r*.S"owDialog#(;
7
return true; 7 =V6.@E(?
3rotected 9verloads 9verrides Function 3rocessC*d2ey#yRe+ *sg 's Syste*.>indows.For*s.@essage& AeyData 's Syste*.>indows.For*s.2eys( 's oolean H H Si el control DataGridView no tiene el +oco&
H se a$andona*os el procedi*iento& lla*ando al *etodo $ase H I+ #ot listView1.Focused( 0"en Return @yase.3rocessC*d2ey#*sg& AeyData( !nd I+ H H Si la tecla presionada es distinta al !0!R& H se a$andona*os el procedi*iento& lla*ando al *etodo $ase H I+ AeyData B? 2eys.!nter 0"en Return @yase.3rocessC*d2ey#*sg& AeyData( !nd I+ H H Sino "ay ite* seleccinado en la lista H se a$andona*os el procedi*iento& lla*ando al *etodo $ase H I+ listView1.SelectedIte*s.Count = E 0"en Return @yase.3rocessC*d2ey#*sg& AeyData( !nd I+ H H 9$tene*os la +ila actual H Di* ite* 's :istViewIte* = listView1.SelectedIte*s#E( I+ r$@ostrar@ensa%e.C"ecAed 0"en @essageox.S"ow#String.For*at#/Se "a seleccionado& CuentaH)E7H DescripcionH)17H/& ite*.0ext& ite*.Su$Ite*s#1(.0ext(( !lseI+ r$@ostrarFor*.C"ecAed 0"en Di* cuenta 's Integer = CInt#ite*.0ext( Di* desc 's String = CStr#ite*.Su$Ite*s#1(.0ext(
Di* +r* 's ew +r*Seleccion#cuenta& desc( +r*.S"owDialog#( !nd I+ Return 0rue
!nd Function
7C'8
7+:.JE"8
0ublicado por 'eandro (uttini en +,:BM KM comentarios: Etiquetas: DataGridView% inorm
s1bado% +, de maro de +,),
[DataGridView] ( Co&%o)ox y evento !electedIndexC"aned Introducción
Nno de los problemas al traba*ar con el DataGridView y los combos en las celdas% es que no hay un eventos preciso que sea lanado al cambiar la selección por parte del usuario. El evento 2ellValue2hanged se podría decir que es el mas cercano a utiliar% pero este solo se produce cuando la celda se de*a de editar% o sea hay que salir de la edición de la celda% y adem1s haber cambiado el ítem seleccionado para que el evento se produca. Es por este punto que este articulo eplicara como ad*untar el combo de&inido en una columna de tipo DataGridView2ombo6o2olumn % al evento Selectednde2hanged% el cual de &orma est1ndar no esta disponible en la grilla.
,lanteo del $ro%le&a
Se dispone de una grilla% la cual presenta un combo en una de sus columnas% y un checH que habilita la selección de la lista de productos. El usuario al cambiar la selección del combo% de &orma autom1tica el sistema debería marcarse el checHbo en la misma &ila en edición.
,ri&er $lanteo de solución
0ara resolver el problema ser1n necesarios dos eventos:
8 Editing2ontrolShowing% el cual se lana cuando la celda entre en estado de edición 8 Selectednde2hanged% el cual ser1 asignado al control combo de la celda que se este editando
private void dataGridView1!ditingControlS"owing#o$%ect sender& DataGridView!ditingControlS"owing!vent'rgs e( ) DataGridViewCo*$oox!ditingControl dgvCo*$o = e.Control as DataGridViewCo*$oox!ditingControl; i+ #dgvCo*$o = null( ) se re*ueve el "andler previo ue pudiera tener asociado& a causa ediciones previas de la celda evitando asi ue se e%ecuten varias veces el evento dgvCo*$o.SelectedIndexC"anged 4= new !vent5andler#dvgCo*$oSelectedIndexC"anged(; dgvCo*$o.SelectedIndexC"anged 6= new !vent5andler#dvgCo*$oSelectedIndexC"anged(; 7 7 private void dvgCo*$oSelectedIndexC"anged#o$%ect sender& !vent'rgs e( ) se recupera el valor del co*$o a *odo de e%e*plo se escri$e en consola el valor seleccionado Co*$oox co*$o = sender as Co*$oox;
Console.>rite:ine#co*$o.SelectedValue(; se accede a la +ila actual& para tra$a%r con otor de sus ca*pos en este caso se *arca el c"ecA si se ca*$ia la seleccion DataGridViewRow row = dataGridView1.CurrentRow;
DataGridViewC"ecAoxCell cell = row.Cells,/Seleccionado/- as DataGridViewC"ecAoxCell; cell.Value = true; 7 Aquí hay algunos puntos a detallar: 8 2omo se observa en el evento Editing2ontrolShowing% este tiene un argumento en el evento que permite tomar que control esta siendo editado% puntualmente el e.2ontrol% el cual puede ser convertido a un tipo especi&ico se quiere traba*ar% en este caso el combobo% cualquier otra celda no ser1 del mismo tipo por lo tanto la conversión devolver1 null.
Vale aclarar que en este caso usar esta línea: DataGridView2ombo6oEditing2ontrol dgv2ombo 9 e.2ontrol as DataGridView2ombo6oEditing2ontrol< o esta otra: 2ombo6o dgv2ombo 9 e.2ontrol as 2ombo6o< es indi&erente% con ambas &unciona correctamente. 8 Seguramente se preguntaran porque se esta realiando la desasignación del evento% cuando en la línea siguiente se vuelve ad*unta. Esto b1sicamente se realia porque si en varias oportunidades es editada la misma celda% en cada ingreso al evento se asignaría un nuevo handler% o sea no es pisado el previo o eistente% provocando que se lance mas de una ve el mismo evento% lo cual no es el e&ecto deseado. 8 En este e*emplo no se hio% pero podría haberse preguntado si el control en edición es del tipo 2ombo6o% mediante el agregado de i&% y el uso del is% para luego en caso de ser a&irmativo en ese caso si convertir al tipo necesario.
private void dataGridView1!ditingControlS"owing#o$%ect sender& DataGridView!ditingControlS"owing!vent'rgs e( ) i+ #e.Control is Co*$oox( ) DataGridViewCo*$oox!ditingControl dgvCo*$o = e.Control as DataGridViewCo*$oox!ditingControl; se re*ueve el "andler previo ue pudiera tener asociado& a causa ediciones previas de la celda evitando asi ue se e%ecuten varias veces el evento dgvCo*$o.SelectedIndexC"anged 4= new !vent5andler#dvgCo*$oSelectedIndexC"anged(; dgvCo*$o.SelectedIndexC"anged 6= new !vent5andler#dvgCo*$oSelectedIndexC"anged(; 7 7
7C'8
7+:.JE"8
,ro%le&a detectado en la $ri&er solución
Si bien el e*emplo anterior &unciona correctamente a primera vista% hay un e&ecto que se puede llegar a mani&estarse% el cual no es nada deseable. Cesulta que en ciertas ocasiones luego de haber editado una de las celdas del combo y seleccionado un ítem% esta &unciono correctamente y marco el checH de la &ila. 0ero al editar otra celda en una &ila distinta% sin haber cambiado opción alguna% se dispara el evento del combo% marcando el checH% cuando no debería hacerlo en ese momento% ya que no hubo cambio de selección alguna. Esto se debe a que el combo queda con el evento asignado% y lo lana cuando entra en edición.
!eundo ,lanteo de solución
Este escenario% si bien resuelve el e&ecto en la selección descripto en los pasos previo% tiene un punto no tan bonito en el código% ya que debe conservar el control que se esta editando de &orma global al &ormulario. 61sicamente la resolución del problema es realiada mediante la quita del evento del combo cuando se de*a de editar la celda% para lo cual se agrega el evento 2ellEndEdit.
DataGridViewCo*$oox!ditingControl dgvCo*$o; private void dataGridView1!ditingControlS"owing#o$%ect sender& DataGridView!ditingControlS"owing!vent'rgs e( ) dgvCo*$o = e.Control as DataGridViewCo*$oox!ditingControl; i+ #dgvCo*$o = null( ) dgvCo*$o.SelectedIndexC"anged 6= new !vent5andler#dvgCo*$oSelectedIndexC"anged(; 7 7 private void dvgCo*$oSelectedIndexC"anged#o$%ect sender& !vent'rgs e( ) se recupera el valor del co*$o a *odo de e%e*plo se escri$e en consola el valor seleccionado Co*$oox co*$o = sender as Co*$oox;
Console.>rite:ine#co*$o.SelectedValue(;
se accede a la +ila actual& para tra$a%r con otor de sus ca*pos en este caso se *arca el c"ecA si se ca*$ia la seleccion DataGridViewRow row = dataGridView1.CurrentRow; DataGridViewC"ecAoxCell cell = row.Cells,/Seleccionado/- as DataGridViewC"ecAoxCell; cell.Value = true; 7 private void dataGridView1Cell!nd!dit#o$%ect sender& DataGridViewCell!vent'rgs e( ) i+ #dgvCo*$o = null( dgvCo*$o.SelectedIndexC"anged 4= new !vent5andler#dvgCo*$oSelectedIndexC"anged(; 7 0untos a remarcar: 8 Se debe conservar el control combobo editado de &orma global del &ormulario% de esta &orma al terminar la edición% poder remover el evento. Este problema se presenta ya que no eiste alg-n otro evento en la g rilla% en donde su argumento devuelva el control que lo genera% de la misma &orma en que lo hace el evento Editing2ontrolShowing% con su argumento e.2ontrol 8 En el evento Editing2ontrolShowing solo hace &alta agregar el handler al evento% ya que la remoción se realia en esta oportunidad cuando es terminada la edición en el evento 2ellEndEdit
7C'8
7+:.JE"8
0ublicado por 'eandro (uttini en ++:KL KO comentarios: Etiquetas: DataGridView
lunes% ) de maro de +,),
[DataGridView] – C3lculos Totales en las *ilas y colu&nas Introducción
Puchas de las veces que se opera con el control DataGridView es necesario realiar c1lculos sobre el mismo% por lo general estos requieres del input del usuario de ciertos valores que traba*aran sobre otros ya cargados en el control
En este articulo tratare de de mostrar como hacer uso del control DataGridView para poder realiar estos c1lculos% re&le*ando el resultado como totales de &ilas y columnas.
Cara de los datos en la rilla
Esta ser1 la primer operación ha realiar% la carga de los datos de los productos en la grilla.
private void +r*3edidos:oad#o$%ect sender& !vent'rgs e( ) Se recupera los datos de los productos desde la ta$la dto3roductos datos = 3roductoD':.3roductosGet'll#(; Se agrega un registro adicional al Data0a$le& para representar la +ila de totales dto3roductos.3roductosRow row0otal = datos.3roductos.ew3roductosRow#(; datos.3roductos.Rows.'dd#row0otal(; Se $indean los datos a la grilla dataGridView1.'utoGenerateColu*ns = +alse; dataGridView1.DataSource = datos; dataGridView1.Data@e*$er = /3roductos/; Se selecciona la ulti*a +ila de 0otales y se *arca co*o readonly para evitar la seleccion por el usuario DataGridViewRow row = dataGridView1.Rows,dataGridView1.Rows.Count 4 1-; row.Read9nly = true; Se asigna el evento para detectar los ca*$ios ue el usuario realice dataGridView1.CellValueC"anged 6=new DataGridViewCell!vent5andler#dataGridView1CellValueC"anged(; 7 2omo se puede apreciar se realian algunas operaciones program1ticamente sobre los datos antes de bindearlos% por e*emplo una de las principales es al agregado de una &ila adicional al &inal del datatable %esta operación es importante ya que permitir1 visualiar la &ila de totales al &inal de la grilla. Qtra operación importante es realiada luego de bindear% en donde se pone en readonly la ultima &ila para evitar que el usuario la edite.
Algo a remarcar es la asignación del evento manuablemente en la ultima línea del evento 'oad del &ormulario% esta asignación es realiada en este punto ya que si se realia por medio del cuadro de propiedades del Visual Studio% el evento 32ellValue2hanged4 ser1 lanado varias veces cuando se carga la grilla% lo cual se evita al no asignar el el evento al comieno% este evento solo es necesario ante la edición del usuario y no en la carga del mismo.
Calculo de totales
Ante la edición del campo de 3pedido4 o la selección de uno de los checH de la columna de 3selección4% es que se disparara este evento.
private void dataGridView1CellValueC"anged#o$%ect sender& DataGridViewCell!vent'rgs e( ) Solo se tra$a%a ante los ca*$ios en la colu*an de los c"ecA$ox y el ingreso de una cani+ad por el usuario i+ #dataGridView1.Colu*ns,e.Colu*nIndex-.a*e == /Seleccion/ JJ dataGridView1.Colu*ns,e.Colu*nIndex-.a*e == /3edido/( ) deci*al totalColu*na = E; Se recorre +ila a +ila para recalcular el total despues del ca*$io +oreac" #DataGridViewRow row in dataGridView1.Rows( ) Se selecciona la celda del c"ecA$ox DataGridViewC"ecAoxCell cellSelecion = row.Cells,/Seleccion/- as DataGridViewC"ecAoxCell; Se valida si esta c"ecAeada i+ #Convert.0ooolean#cellSelecion.Value(( ) Se valida si el usuario ingreso un valor en la celda de pedido deci*al pedido = E; i+ # deci*al.0ry3arse#Convert.0oString#row.Cells,/3edido/-.Value(& out pedido(( continue;
Se realiKa el calculo para la +ila& asignado el total en la celda /0otal/ de la *is*a deci*al totalFila = Convert.0oDeci*al#row.Cells,/3recio8nitario/-.Value( L pedido; row.Cells,/0otal/-.Value = totalFila; Se au*ula el total de cada una de las +ilas totalColu*na 6= totalFila; 7 7 Se to*a la ulti*a +ila del total general& asignando el valor acu*ulado en el calculo DataGridViewRow row0otal = dataGridView1.Rows,dataGridView1.Rows.Count 4 1-; row0otal.Cells,/0otal/-.Value = totalColu*na; 7 7 En este evento se recorrer1 cada una de las &ilas de la grilla realiando los c1lculos a nivel de la propia &ila% pero tambi#n de la columna de totales. Adicionalmente se agrego el evento de validación% ante una entrada incorrecta del usuario en la celda de pedidos% si el usuario ingresa letras se mostrara un alerta en la &ila.
private void dataGridView1CellValidating#o$%ect sender& DataGridViewCellValidating!vent'rgs e( ) i+ #dataGridView1.Colu*ns,e.Colu*nIndex-.a*e == /3edido/( ) Si el ca*po esta vacio no lo *arco co*o error i+ #string.Isull9r!*pty#e.For*attedValue.0oString#((( return; Solo se valida ante el ingreso de un valor en el ca*po deci*al pedido = E; i+ #deci*al.0ry3arse#e.For*attedValue.0oString#(& out pedido(( ) DataGridViewRow row = dataGridView1.Rows,e.RowIndex-; row.!rror0ext = /De$e ingresar un nMN*ero valido/; e.Cancel = true; 7 7 7
!ste evento es usado al presiona !SC cancelando la edicion se eli*ine el *ensa%e de error en la +ila private void dataGridView1Cell!nd!dit#o$%ect sender& DataGridViewCell!vent'rgs e( ) dataGridView1.Rows,e.RowIndex-.!rror0ext = String.!*pty; 7
@ota: ay un problema en las validaciones en la grilla. Si por alguna raón cuando usa las validaciones en el DataGridView% no visualia el icono con el mensa*e del error esto se puede deber a que la propiedad AutoSieCowsPode no esta asignada con el valor @one. DataGridView).AutoSieCowsPode 9 DataGridViewAutoSieCowsPode.@one tenga en cuanta este punto cuando use las validaciones
7C'8
7+:.JE"8
0ublicado por 'eandro (uttini en )O:)M BF comentarios: Etiquetas: DataGridView
mi#rcoles% +, de enero de +,),
[DataGridView] ( Uso del DataGridViewCo&%o)oxColu&n Introducción
Este articulo tendr1 por ob*etivo mostrar como traba*ar con las columna del tipo 2ombo6o que se encuentran dentro de una celda del datagridview.
4( De*inición de las colu&nas en tie&$o de dise5o
Nn paso importante es la de&inición de las columnas para ello en este caso eplicare como hacerlo en tiempo de diseIo y poder así controlar que datos visualiar.
'a opción para realiar esta operación se encuentra haciendo clicH con el botón derecho del mouse en el control DataGridView del &ormulario% visualiando una lista de ítems como se muestran en la imagen
Aquí puede seleccionarse dos opciones: 8 Agregar nuevas columnas a la grilla por medio de la opción 3Add 2olumn R4 visuali1ndose el siguiente cuadro:
2omo se observa en la imagen% puede de&inirse in&ormación r1pida del tipo de columna que se quiere representar en la grilla. 8 Editar columnas eistentes% mediante la opción 3Edit 2olumnsR4 visualiando un cuadro como el siguiente
'o interesante de esto es que uno podr1 controlar que visualiar% en que orden% &ormato% tipo de columna y adem1s todo desde un entorno visual 'a idea de estos di1logos es de&inir r1pidamente las columnas mediante la opción de 3Add 2olumnR4 para luego pasar a la edición mediante 3Edit 2olumnsR4 y especi&icar propiedades que son importantes para que todo &uncione. Nna de las propiedades importantes es Data0roperty@ame% esta es &undamental para indicar que campo del origen de datos ser1 asignado a esa columna. Al momento de cargar la grilla el valor de esa propiedad ser1 tomado del origen de datos y asea un Data(able% o 'istT% o cualquier otro que sea asignado y se mapear1 con la columna usando esta propiedad. Sino se asigna in&ormación a la propiedad Data0roperty@ame ese campo no cargara datos alguno% lo cual puede ser interesante para campos calculados como veremos en e*emplo mas adelante. Es importante adem1s que la propiedad AutoGenerate2olumns sea establecida en &alse cuando se de&inan las columnas en tiempo de diseIo% ya que en caso de no hacerlo se aIadir1 a la grilla las columnas generadas en runtime% lo cual no es deseable en este caso.
6 – +sinación de los datos a la colu&na DataGridViewCo&%o)oxColu&n
Empearemos por cargar la in&ormación en un e*emplo simple% en este solo se tendr1 un -nico campo del tipo combobo en el columna del DataGridView. En este caso se trata de una grilla de p roducto con sus precios unitarios% adem1s cada producto pertenece a una marca especi&ica% que podr1 seleccionarse entre las disponibles por el sistema. 'os pasos a seguir ser1n: 8 se recuperara la columna que &ue de&inida del tipo combobo a la cual se le asignaran los datos a desplegar% en este caso ser1n las Parcas disponibles. 8 y por ultimo se cargara la grilla con los datos de los 0roductos. El &ormulario que visualiaría ser1 el siguiente:
'a carga de los datos se ha realiado en el evento 'oad del &ormulario
private void For*1:oad#o$%ect sender& !vent'rgs e( ) 'signo los datos del co*$o de *arcas DataGridViewCo*$ooxColu*n co*$o$oxColu*n = dataGridView1.Colu*ns,/@arca/- as DataGridViewCo*$ooxColu*n; co*$o$oxColu*n.DataSource = 3roductosD':.Get'll@arca#(; co*$o$oxColu*n.Display@e*$er = /Descripcion/; co*$o$oxColu*n.Value@e*$er = /Id@arca/; $indeo los datos de los productos a la grilla dataGridView1.'utoGenerateColu*ns = +alse; dataGridView1.DataSource = 3roductosD':.Get'll3roductos#(; 7
Es interesante notar que la primer parte se recupera la columna del DataGridView que de&ine el combobo% la cual se programa como si se tratara de un combobo normal de .net% utiliando las propiedades DataSource% a la cual se le asignado el origen de datos con la lista de Parcas% el DisplayPember y ValuePember% para asignar que campo de la lista de Parcas ser1 visible al usuario y cual ser1 el id de cada ítem listado. El segunda parte carga los datos del DataGridView% tomando todos los producto a mostrar en la grilla. Adem1s se especi&ica la propiedad AutoGenerate2olumns de&iniendo que solo las columnas creadas en tiempo de diseIo ser1n las visibles. A continuación se visualiara los m#todo utiliados para cargar los datos en el DataGridView
pu$lic static :istB@arca!ntity? Get'll@arca#( ) string sl = O/S!:!C0 Id@arca &Descripcion FR9@ @arcas/; :istB@arca!ntity? list = new :istB@arca!ntity?#(; using #9leD$Connection conn = new 9leD$Connection#
[email protected],/de+ault/-.0oStrin g#((( ) 9leD$Co**and co**and = new 9leD$Co**and#sl& conn(;
conn.9pen#(; 9leD$DataReader reader = co**and.!xecuteReader#(; w"ile #reader.Read#(( ) list.'dd#:oad@arca#reader((; 7
return list; 7 7 private static @arca!ntity :oad@arca#IDataReader reader( ) @arca!ntity *arca = new @arca!ntity#(; *arca.Id@arca = Convert.0oInt<#reader,/Id@arca/-(; *arca.Descripcion = Convert.0oString#reader,/Descripcion/-(; return *arca; 7
pu$lic static :istB3roducto!ntity? Get'll3roductos#( )
string sl = O/S!:!C0 ,Id3roducto&,Id@arca&,Descripcion&,3recio8nitarioFR9@ 3roductos/; :istB3roducto!ntity? list = new :istB3roducto!ntity?#(;
using #9leD$Connection conn = new 9leD$Connection#
[email protected],/de+ault/-.0oStrin g#((( ) 9leD$Co**and co**and = new 9leD$Co**and#sl& conn(;
conn.9pen#(; 9leD$DataReader reader = co**and.!xecuteReader#(; w"ile #reader.Read#(( ) list.'dd#:oad3roducto#reader((; 7
return list; 7 7 private static 3roducto!ntity :oad3roducto#IDataReader reader( ) 3roducto!ntity producto = new 3roducto!ntity#(; producto.Id3roducto = Convert.0oInt<#reader,/Id3roducto/-(; producto.Id@arca = Convert.0oInt<#reader,/Id@arca/-(; producto.Descripcion = Convert.0oString#reader,/Descripcion/-(; producto.3recio8nitario = Convert.0oDeci*al#reader,/3recio8nitario/-(; return producto; 7
7C'8
7+:.JE"8
7 – #eali8ar una o$eración al ca&%iar la selección del co&%o
En este sección se analiara como poder traba*ar con un combobo que ha sido agregado a la grilla. En este e*emplo se agrego un atributo nuevo al producto% re&erido a un descuento% seg-n el el valor seleccionado del combo se realiara una operación con el mismo y el valor calculado ser1 presentado en otra celda de la misma &ila en donde se visualia la in&ormación del producto. El &ormulario ahora tomara la siguiente &orma
Adem1s si se analia las propiedades de la nueva columna se podr1 apreciar que la propiedad Data0roperty@ame se le ha especi&icado el nombre del campo de la tabla de productos% y es el mismo nombre de la propiedad en la clase 0roductoEntity.
A di&erencia el e*emplo anterior en este solo se agregaron las línea para cargar los ítems de descuento
private void For*1:oad#o$%ect sender& !vent'rgs e(
) 'signo los datos del co*$o de *arcas DataGridViewCo*$ooxColu*n co*$o$oxColu*n = dataGridView1.Colu*ns,/@arca/- as DataGridViewCo*$ooxColu*n; co*$o$oxColu*n.DataSource = 3roductosD':.Get'll@arca#(; co*$o$oxColu*n.Display@e*$er = /Descripcion/; co*$o$oxColu*n.Value@e*$er = /Id@arca/; 'signo los datos del co*$o de descuentos DataGridViewCo*$ooxColu*n dgcco*$oDescuento = dataGridView1.Colu*ns,/Descuento/- as DataGridViewCo*$ooxColu*n; dgcco*$oDescuento.DataSource = 3roductosD':.Get'llDescuentos#(; dgcco*$oDescuento.Display@e*$er = /Descripcion/; dgcco*$oDescuento.Value@e*$er = /IdDescuento/; $indeo los datos de los productos a la grilla dataGridView1.'utoGenerateColu*ns = +alse; dataGridView1.DataSource = 3roductosD':.Get'll3roductos#(; 7 0ero lo mas importante es ver como se traba*a con el combo% detectando un cambio en el ítem y realiando el calculo del descuento.
private void dataGridView1CellValueC"anged#o$%ect sender& DataGridViewCell!vent'rgs e( ) i+ #dataGridView1.Colu*ns,e.Colu*nIndex-.a*e == /Descuento/( ) se o$tiene el valor seleccionado en el co*$o DataGridViewCo*$ooxCell co*$o = dataGridView1.Rows,e.RowIndex-.Cells,e.Colu*nIndex- as DataGridViewCo*$ooxCell; int idDescuento = Convert.0oInt<#co*$o.Value(; se recupera por el id la in+o del descuento Descuento!ntity descuento = 3roductosD':.GetDescuentosyId#idDescuento(; se calcula el descuento
DataGridViewCell cell3recio8nitario = dataGridView1.Rows,e.RowIndex-.Cells,/3recio/-; DataGridViewCell cell3recioFinal = dataGridView1.Rows,e.RowIndex-.Cells,/3recioFinal/-; deci*al valordescontar = #descuento.3orcenta%e L Convert.0oDeci*al#cell3recio8nitario.Value(( 1EE; cell3recioFinal.Value = Convert.0oDeci*al#cell3recio8nitario.Value( 4 valordescontar; 7 7 En este caso se hio uso del evento 2ellValue2hange% y dentro de este se realiando las operaciones para traba*ar con el valor seleccionado del combo. 8 0rimeramente se valida que siempre se traba*e con la columna que uno quiere operar% en este caso por el nombre se valida que sea la de&inida para el descuento. Debe recordarse que estos eventos tambi#n puede disparase para la edición de otras celdas para las dem1s columnas. 0ero en este caso como el calculo solo interesa hacerlo en la columna de descuento es esta la veri&icada. 8 2omo segundo pasos se toma el id del descuento seleccionado en el combo% debe recordarse que al momento de cargar los ítems del combo% &ueron los id los que se unieron a la propiedad ValuePember. 8 2on el id del descuento se accede a la base de datos para recuperar la entidad del descuento y con esta el valor del porcenta*e que ser1 usado en el calculo 8 0or ultimo se recuperas la in&ormación de las celdas que restan y se procede a realiar el calculo del porcenta*e que ser1 desplegado en la ultima columna de la grilla. Algo interesante a notar es que esta ultima columna que se hace llamar 30recio inal4 no tiene valor alguno en la propiedad Data0roperty@ame% es por ello que no se carga ning-n valor proveniente de la base de datos.
7C'8
7+:.JE"8
0ublicado por 'eandro (uttini en ),:FF )J) comentarios: Etiquetas: 2>% DataGridView% V6.@E(
domingo% K de enero de +,),
[DataGridView] ,asa9e de in*or&ación entre rids en distintos *or&ulario Introducción
Este artículo es consecuencia de otros descriptos con anterioridad 2> U 2omunicar &ormularios de &orma desacoplada 2omo se habr1 visto comunicar &ormularios de &orma desacoplada puede no se tan simple alguna veces y es *ustamente cuando se hace uso de in&ormación entre grillas que la situación puede ser algo mas comple*a Este e*emplo intenta demostrar como realiar la comunicación y desde un &ormulario hi*o pasar in&ormación de ítems seleccionados al un &ormulario padre o quien realia la llamada.
De*inición de la Inter*a8
0ara la comunicación e&iciente de los &ormulario% se crearan un contrato que permitir1 enlaarlos con el mínimo acoplamiento entre ellos.
inter+ace I'ddIte* ) void 'ddewIte*#DataGridViewRow row(; 7 2omo se observa el m#todo que tomara el retorno de la selección del ítem de&ine un DataGridViewCow% o sea un registro completo seleccionado en la grilla del &ormulario hi*o.
0or&ulario ,adre
2omo se observara el &ormulario padre que realiara la apertura debe implementar la inter&a Addtem de&inida en el punto anterior.
pu$lic partial class For*1 For*& I'ddIte* ) pu$lic For*1#( ) InitialiKeCo*ponent#(; 7
private void $utton1ClicA#o$%ect sender& !vent'rgs e( ) For* +or*'dd = new For*#(; +or*'dd.S"ow#t"is(; 7
Pregion I'ddIte* @e*$ers pu$lic void 'ddewIte*#DataGridViewRow row( ) string ite* = row.Cells,/ite*/-.Value.0oString#(; string desc = row.Cells,/Desc/-.Value.0oString#(; t"is.dataGridView1.Rows.'dd#new ,-) ite*& desc 7(; 7
Pendregion
7
Es importante destacar algunas líneas: 8 'ínea )): es el punto en donde se realia la apertura del &orma hi*o% y es allí donde se le indica quien es el padre o quien esta realiando al apertura del &ormulario% esto se esta indicando al hacer uso del 3this4 en el par1metro del m#todo Show57 8 'íneas )O8+B: en estas línea de código se estar1 tomando la &ila que se retorna de la selección% se recupera cada valor y se arma el nuevo registro% en este punto en caso de que &uera necesario se podría realiar c1lculos o modi&icar los datos% para ser luego insertados en la grilla de ítems seleccionados.
0or&ulario :i9o
Este &ormulario contiene la grilla con los ítems que pueden ser seleccionados% los cuales a modo de e*emplo &ueron creados manualmente en un Data(able. El punto clave aquí es el botón que envía el registro seleccionado% del datagridview del &ormulario hi*o al &ormulario padre que realio la llamada:
private void $utton1ClicA#o$%ect sender& !vent'rgs e( ) DataGridViewRow row = t"is.dataGridView1.SelectedRows,E- as DataGridViewRow;
7
I'ddIte* parent = t"is.9wner as I'ddIte*; parent.'ddewIte*#row(; t"is.Close#(;
2omo se observa se toma la &ila seleccionada% y acto seguido se llamada al m#todo de la inter&a del &ormulario que realio la llamada.
El par1metro 3this4 enviado en el m#todo Show57 es *ustamente la propiedad Qwner del &ormulario hi*o% y al implementar la inter&a este puede ser casteado a el tipo Addtem sin problemas% para luego invocar al m#todo que de&ine.
7C'8
7+:.JE"8
0ublicado por 'eandro (uttini en +,:+, BO comentarios: Etiquetas: 2>% DataGridView% inorm
*ueves% ), de diciembre de +,,M
[DataGridView] ,arte 6 – Edición de celda con *or& ,o$U$ $ara la selección de -te& ( ;eyDown El ob*etivo del articulo es demostrar como en la edición de la celda se puede lanar un &ormulario de b-squeda para la selección de un ítem determinado% y a retorno del mismo completar la in&ormación de la &ila en e dición con la selección del &ormulario. 0ara esta operación se hace uso de propiedades% y clases las cuales permitir1n desacoplar ambas grilla% tanto la que originalmente mantiene la lista de productos seleccionados% como la que se despliega y permite la elección de un ítem determinado. En el &ormulario cuyo ob*etico ser1 llevar la lista de ítems elegidos por el usuario se dispone de siguiente código.
private void dataGridView1!ditingControlS"owing#o$%ect sender& DataGridView!ditingControlS"owing!vent'rgs e( ) DataGridView0extox!ditingControl d0ext = #DataGridView0extox!ditingControl(e.Control; d0ext.2eyDown 4= new 2ey!vent5andler#d0ext2eyDown(; d0ext.2eyDown 6= new 2ey!vent5andler#d0ext2eyDown(; 7 void d0ext2eyDown#o$%ect sender& 2ey!vent'rgs e( ) int rowIndex = ##Syste*.>indows.For*s.DataGridView0extox!ditingControl( #sender((.!ditingControlRowIndex; i+ #e.'lt QQ e.2eyCode == 2eys.D( ) +r*Seleccionar3roducto +or* = new +r*Seleccionar3roducto#(;
+or*.S"owDialog#(; 3roducto productoSeleccionado = +or*.3roductSelected;
DataGridViewRow row = dataGridView1.Rows,rowIndex-; row.Cells,/Id3roducto/-.Value = productoSeleccionado.Id3roducto; row.Cells,/Descripcion/-.Value = productoSeleccionado.Descripcion; row.Cells,/precio/-.Value = productoSeleccionado.3recio;
dataGridView1.!nd!dit#(; 7
7 2omo se observa mucha de la &uncionalidad tiene que ver con la asignación de los eventos que permitir1n capturar la pulsación de la teclas de&inidas para que se visualice el &ormulario de 0opNp. En este caso si bien es posible utiliar cualquier tecla% se decidió que la combinación de Alt D seria la adecuada% pero podría seleccionar la que sea necesario. 2omo se observa si se detecta la pulsación de la tecla% se crea u na instancia del &ormulario y se muestra en &ormulario modal. Al cierre del mismo se captura la propiedad con el ítem elegido y se carga en la grilla. El &ormulario que se desplegara tiene un código muy simple en donde simplemente al hacer dobleclicH en una de sus &ilas% la marcara como seleccionada y cerrar el &ormulario.
private void dataGridView1CellDou$leClicA#o$%ect sender& DataGridViewCell!vent'rgs e( ) DataGridViewRow row = dataGridView1.SelectedRows,E-; t"is.3roductSelected = new 3roducto#( ) Id3roducto = Convert.0oInt<#row.Cells,/Id3roducto/-.Value(& Descripcion = Convert.0oString#row.Cells,/Descripcion/-.Value(& 3recio = Convert.0oDeci*al#row.Cells,/precio/-.Value(& 7; 7
t"is.Close#(;
7C'8
7+:.JE"8
0ublicado por 'eandro (uttini en +,:KJ J comentarios: Etiquetas: 2>% DataGridView% inorm
[DataGridView] ,arte 4 – Valor de celda Condicional usando Cell0or&attin El e*emplo intenta demostrar como una ve que se bindean los datos estos pueden ser acomodados en las celda seg-n cierta condición.
En este e*emplo se toma un origen de datos con tres columnas pero solo dos ser1n representadas como datos en la grilla% ya que una condición indicara si debe
private void dataGridView1CellFor*atting#o$%ect sender& DataGridViewCellFor*atting!vent'rgs e( ) DataGridViewColu*n currentColu*n = dataGridView1.Colu*ns,e.Colu*nIndex-; i+ #currentColu*n.a*e == /Fracciona/( ) DataGridViewRow currentRow = dataGridView1.Rows,e.RowIndex-; DataRowView data = currentRow.DataoundIte* as DataRowView; i+ #data == null( return;
i+#Convert.0ooolean#data,/+racc/-(( currentRow.Cells,/tipoventa/-.Value = Convert.0oString#data,/F9R@V!0/-(; else currentRow.Cells,/tipoventa/-.Value = Convert.0oString#data,/3R!S!0'CI/-(; 7 7 En este caso la lógica principal se encuentra en el evento 2ellormatting% pues este ser1 el encargado de realia la lógica necesaria para decidir que campo de los datos bindeados deben representarse en la celda. Se podr1 visualiar que un campo que si se ha enlaado a la grilla mediante la propiedad Data0roperty@ame pero el segunda columnas de la grilla no se le ha asignado este valor ya que ser1 por medio de código quien d ecida que valor mostrar. Nna de las líneas mas importantes es la O% ya que esta permite recuperar los datos originales que se est1n bindeando a esa &ila en particular% y por lo tanto traba*ar con ellos. 'os datos utiliados para el e*emplo son los siguiente
private Data0a$le GetData0a$le#( ) Data0a$le dt = new Data0a$le#(;
dt.Colu*ns.'dd#/+racc/& typeo+#$ool((; dt.Colu*ns.'dd#/3R!S!0'CI/(; dt.Colu*ns.'dd#/F9R@V!0/(; DataRow row = dt.ewRow#(; row,/+racc/- = true; row,/3R!S!0'CI/- = /3R!S!0'CI 1/; row,/F9R@V!0/- = /F9R@V!0 1/;
dt.Rows.'dd#row(;
row = dt.ewRow#(; row,/+racc/- = +alse; row,/3R!S!0'CI/- = /3R!S!0'CI /; row,/F9R@V!0/- = /F9R@V!0 /; dt.Rows.'dd#row(;
row = dt.ewRow#(; row,/+racc/- = +alse; row,/3R!S!0'CI/- = /3R!S!0'CI ; row,/F9R@V!0/- = /F9R@V!0 ; dt.Rows.'dd#row(;
row = dt.ewRow#(; row,/+racc/- = true; row,/3R!S!0'CI/- = /3R!S!0'CI /; row,/F9R@V!0/- = /F9R@V!0 /; dt.Rows.'dd#row(; return dt;
7 esto es importante para poder conocer como se accede a la in&ormación bideada en la grilla. 2omo &uncionalidad adicional se permite que el usuario al marcar o desmarcar una celda esta cambie el contenido con respecto al valor que se obtuvo al momento de bindear la & ila
private void dataGridView1CellContentClicA#o$%ect sender& DataGridViewCell!vent'rgs e( ) DataGridViewColu*n currentColu*n = dataGridView1.Colu*ns,e.Colu*nIndex-; i+ #currentColu*n.a*e == /Fracciona/( ) DataGridViewC"ecAoxCell currentCell = dataGridView1.Rows,e.RowIndex-.Cells,e.Colu*nIndex- as DataGridViewC"ecAoxCell; DataGridViewRow currentRow = dataGridView1.Rows,e.RowIndex-; DataRowView data = currentRow.DataoundIte* as DataRowView; i+ #data == null( return;
i+ #Convert.0ooolean#currentCell.Value(( currentRow.Cells,/tipoventa/-.Value = Convert.0oString#data,/F9R@V!0/-(; else currentRow.Cells,/tipoventa/-.Value = Convert.0oString#data,/3R!S!0'CI/-(;
dataGridView1.!nd!dit#(; 7
7
7C'8
7+:.JE"8
0ublicado por 'eandro (uttini en )J:), +F comentarios: Etiquetas: 2>% DataGridView
mi#rcoles% + de diciembre de +,,M
[DataGridView] ;ey,ress detectar E1TE# y %ús
private void dataGridView1Cell!nter#o$%ect sender& DataGridViewCell!vent'rgs e( ) dataGridView1.egin!dit#+alse(; 7 private void dataGridView1!ditingControlS"owing#o$%ect sender& DataGridView!ditingControlS"owing!vent'rgs e( ) DataGridView0extox!ditingControl d0ext = #DataGridView0extox!ditingControl(e.Control; d0ext.2ey8p 4= new 2ey!vent5andler#text2ey8p(; d0ext.2ey8p 6= new 2ey!vent5andler#text2ey8p(; 7 void text2ey8p#o$%ect sender& 2ey!vent'rgs e( ) int rowIndex = ##Syste*.>indows.For*s.DataGridView0extox!ditingControl( #sender((.!ditingControlRowIndex; i+ #e.2eyCode == 2eys.!nter( ) int value!ntered = Convert.0oInt<#dataGridView1.Rows,rowIndex 4 1-.Cells,/cuenta/-.Value(; dataGridView1.Rows,rowIndex 4 1-.Cells,/descripcion/-.Value = t"is.Searc"#value!ntered(; 7
7 2omo se observa hay varios eventos asociados al DataGridView necesarios para poder controlar la pulsación del enter en las celdas. Al editar la calda esta asocia el evento una clase de nombre DataGridView(et6oEditing2ontrol% la cual representa un (et6o control asociado a una DataGridView(et6o2ell. Se vera adem1s que se realia una operación de b-squeda% en este caso para simpli&icar el e*emplo se realia sobre un datatable cargado previamente% para lo cual se ha utiliado 'in"
private Data0a$le GetData0a$le#( ) Data0a$le dt = new Data0a$le#(;
dt.Colu*ns.'dd#/cuenta/(; dt.Colu*ns.'dd#/descripcion/(;
DataRow row = dt.ewRow#(; row,/cuenta/- = /1EE1/; row,/descripcion/- = /cuenta 1EE1/; dt.Rows.'dd#row(;
row = dt.ewRow#(; row,/cuenta/- = /1EE/; row,/descripcion/- = /cuenta 1EE/; dt.Rows.'dd#row(;
row = dt.ewRow#(; row,/cuenta/- = /1EE; row,/descripcion/- = /cuenta 1EE; dt.Rows.'dd#row(; return dt;
7 private string Searc"#int cuenta( ) string descripcion = #+ro* ite* in t"is.GetData0a$le#(.'s!nu*era$le#( w"ere Convert.0oInt<#ite*,/cuenta/-( == cuenta select ite*,/descripcion/-.0oString#((.First9rDe+aultBstring?#(; return descripcion; 7
7C'8
Introducción Este es un ejemplo de cómo utilizar el componente Listview de CSharp. En este artículo te muestro como agregar y eliminar datos a dicho componente, y tami!n el uso de TimeSpan, "ue en este ejemplo lo utilizo para calcular la edad. #ueno espero "ue les sea de su utilidad.
$ise%o del &ormulario
Nota: 'gregar un Lael y en su propiedad (ame colocar llcodigo y en la
propiedad )e*t colocar el valor +, esto nos permitir autogenerar el código.
'c les muestro el Códigousing Syste*; using Syste*.Collections.Generic;
using Syste*.Co*ponent@odel; using Syste*.Data; using Syste*.Drawing; using Syste*.0ext; using Syste*.>indows.For*s;
na*espace >indows'pplication ) pu$lic partial class Fr*:istView For* ) pu$lic Fr*:istView#( )
InitialiKeCo*ponent#(; 7
!l :a$el l$lcodigo est oculto& y en su propiedad text colocar 1 para poder generar el cTdigo... private void $tnagregarClicA#o$%ect sender& !vent'rgs e( )
int edad; string +1;
+1 = dt+ecnaci.Value.0oS"ortDateString#(; 0i*eSpan di+erencia = Convert.0oDate0i*e#Date0i*e.ow.0oS"ortDateString#(( 4 Convert.0oDate0i*e#+1(; edad = Convert.0oInt1U#di+erencia.Days.0oString#((
:istViewIte* ele*eneto = new :istViewIte*#(; ele*eneto = listView1.Ite*s.'dd#l$lcodigo.0ext(;
ele*eneto.Su$Ite*s.'dd#txtapellidos.0ext(;
ele*eneto.Su$Ite*s.'dd#txtno*$res.0ext(;
ele*eneto.Su$Ite*s.'dd#edad.0oString#((;
ele*eneto.Su$Ite*s.'dd#txtele+ono.0ext(;
ele*eneto.Su$Ite*s.'dd#c$osexo.0ext(;
:i*piar#(;
GeneraCodigo#(; 7
private void Fr*:istView:oad#o$%ect sender& !vent'rgs e( )
listView1.Colu*ns.'dd#/CTdigo/& WE& 5oriKontal'lign*ent.:e+t(;
listView1.Colu*ns.'dd#/'pellidos/& 1E& 5oriKontal'lign*ent.:e+t(;
listView1.Colu*ns.'dd#/o*$re#s(/& 1E& 5oriKontal'lign*ent.:e+t(;
listView1.Colu*ns.'dd#/!dad/& E& 5oriKontal'lign*ent.:e+t(;
listView1.Colu*ns.'dd#/0elX+ono/& YE& 5oriKontal'lign*ent.:e+t(;
listView1.Colu*ns.'dd#/Sexo/& ZE& 5oriKontal'lign*ent.:e+t(; listView1.View = View.Details;
7
private void :i*piar#( ) +oreac" #Control o$% in t"is.groupox1.Controls( ) i+ #o$% is 0extox( ) o$%.0ext = //; 7
txtapellidos.Focus#(; 7 7
private void GeneraCodigo#( ) int c; int nuevo; string ele*ento; c = listView1.Ite*s.Count 4 1; ele*ento = listView1.Ite*s,c-.0ext.0oString#(; nuevo = Convert.0oInt1U#ele*ento( 6 1; l$lcodigo.0ext = nuevo.0oString#(;
7 private void Solo:etras#o$%ect sender& 2ey3ress!vent'rgs e( ) int Aeyascii = Convert.0oInt<#e.2eyC"ar(;
i+ ##Aeyascii ?= U QQ Aeyascii B= ZE( JJ #Aeyascii ?= ZW QQ Aeyascii B= 1( JJ #Aeyascii == <( JJ #Aeyascii == Y(( ) e.5andled = +alse; 7 else ) e.5andled = true; 7 7
private void Solou*eros#o$%ect sender& 2ey3ress!vent'rgs e( )
int Aeyascii = Convert.0oInt<#e.2eyC"ar(; i+ ##Aeyascii ?= Y QQ Aeyascii B= W( JJ #Aeyascii == Y(( ) e.5andled = +alse; 7 else ) e.5andled = true; 7 7
private void $tneli*inarClicA#o$%ect sender& !vent'rgs e( ) int nu*index = listView1.Ite*s.Count 4 1;
i+ #listView1.Ite*s.Count?E( )
listView1.Ite*s.Re*ove#listView1.Ite*s,nu*index-(; 7
i+ #Convert.0oInt1U#listView1.Ite*s.Count( == E( ) l$lcodigo.0ext = /1/; 7