Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

DataGridView: Estilo de columna

1,673 views
Skip to first unread message

Diego Romero

unread,
Nov 22, 2007, 6:14:23 PM11/22/07
to
Hola como estan ?

Como sabemos el datagridview de VB.net 2005, tiene estilos de columna como
Combobox, Textbox y Check

¿ Alguien sabe como agregar una columna con estilo DatePicker,
MaskEditTexbox, etc ?

ó como ubicar un control de este estilo en una celda, no he encontrado las
propiedades de Location en la celda.


Diego M Romero


Luis Miguel Blanco

unread,
Nov 24, 2007, 1:56:01 AM11/24/07
to
Hola Diego

Para conseguir mostrar una columna de un DataGridView cuyas celdas contengan
a su vez otro control, por ejemplo DateTimePicker, debes realizar varios
pasos que permitan a un objeto DataGridViewColumn -la clase base de las
columnas mostradas por un DataGridView- visualizar el control en cada una de
sus celdas.

En primer lugar debes crear una clase que herede del control que quieres
incrustar en las celdas, en este caso DateTimePicker, implementando también
la interfaz IDataGridViewEditingControl, que nos permitirá realizar la
edición del valor de una celda utilizando el mencionado control. Debemos
escribir el código para aquellas propiedades y métodos encargados de las
operaciones de edición de forma similar a como puedes ver en el siguiente
bloque de código:

'////////////////////////////////
Public Class EditorValorCelda
Inherits DateTimePicker
Implements IDataGridViewEditingControl

' variables de uso interno
Private nNumeroFila As Integer
Private oDGV As DataGridView
Private bValorCambiado As Boolean = False

' propiedades
Public Property EditingControlDataGridView() As
System.Windows.Forms.DataGridView Implements
System.Windows.Forms.IDataGridViewEditingControl.EditingControlDataGridView
Get
Return oDGV
End Get
Set(ByVal value As System.Windows.Forms.DataGridView)
oDGV = value
End Set
End Property

Public Property EditingControlFormattedValue() As Object Implements
System.Windows.Forms.IDataGridViewEditingControl.EditingControlFormattedValue
Get
Return Me.Value
End Get
Set(ByVal value As Object)
Me.Value = value
End Set
End Property

Public Property EditingControlRowIndex() As Integer Implements
System.Windows.Forms.IDataGridViewEditingControl.EditingControlRowIndex
Get
Return nNumeroFila
End Get
Set(ByVal value As Integer)
nNumeroFila = value
End Set
End Property

Public Property EditingControlValueChanged() As Boolean Implements
System.Windows.Forms.IDataGridViewEditingControl.EditingControlValueChanged
Get
Return bValorCambiado
End Get
Set(ByVal value As Boolean)
bValorCambiado = value
End Set
End Property

Public ReadOnly Property EditingPanelCursor() As
System.Windows.Forms.Cursor Implements
System.Windows.Forms.IDataGridViewEditingControl.EditingPanelCursor
Get
Return MyBase.Cursor
End Get
End Property

Public ReadOnly Property RepositionEditingControlOnValueChange() As
Boolean Implements
System.Windows.Forms.IDataGridViewEditingControl.RepositionEditingControlOnValueChange
Get
Return False
End Get
End Property

' métodos
Public Sub ApplyCellStyleToEditingControl(ByVal dataGridViewCellStyle As
System.Windows.Forms.DataGridViewCellStyle) Implements
System.Windows.Forms.IDataGridViewEditingControl.ApplyCellStyleToEditingControl
Me.Font = dataGridViewCellStyle.Font
Me.ForeColor = dataGridViewCellStyle.ForeColor
Me.BackColor = dataGridViewCellStyle.BackColor
End Sub

Public Function EditingControlWantsInputKey(ByVal keyData As
System.Windows.Forms.Keys, ByVal dataGridViewWantsInputKey As Boolean) As
Boolean Implements
System.Windows.Forms.IDataGridViewEditingControl.EditingControlWantsInputKey
Select Case keyData And Keys.KeyCode
Case Keys.Left, Keys.Up, Keys.Down, Keys.Right, _
Keys.Home, Keys.End, Keys.PageDown, Keys.PageUp

Return True
Case Else
Return False
End Select
End Function

Public Function GetEditingControlFormattedValue(ByVal context As
System.Windows.Forms.DataGridViewDataErrorContexts) As Object Implements
System.Windows.Forms.IDataGridViewEditingControl.GetEditingControlFormattedValue
Return Me.Value.ToString("dd-MM-yyyy")
End Function

Protected Overrides Sub OnTextChanged(ByVal e As System.EventArgs)
bValorCambiado = True
Me.EditingControlDataGridView.NotifyCurrentCellDirty(True)
MyBase.OnTextChanged(e)

End Sub

Public Sub PrepareEditingControlForEdit(ByVal selectAll As Boolean)
Implements
System.Windows.Forms.IDataGridViewEditingControl.PrepareEditingControlForEdit
' no es necesario codificar este método
End Sub
End Class
'////////////////////////////////

A continuación creamos una clase que herede de algunas de las clases que el
control DataGridView utiliza para la manipulación de los valores de sus
celdas. La clase base abstracta de este tipo es DataGridViewCell, y heredando
de esta tenemos DataGridViewTextBoxCell que representa una celda de valores
en formato texto. Podemos crear una clase que herede de esta última,
reemplazando aquellos miembros de la clase que necesitemos para mostrar la
información en la celda, como puedes ver en el siguiente bloque de código:

'////////////////////////////////
Public Class CeldaPersonalizada
Inherits DataGridViewTextBoxCell

' propiedades
Public Overrides ReadOnly Property EditType() As System.Type
Get
Return GetType(EditorValorCelda)
End Get
End Property

Public Overrides ReadOnly Property ValueType() As System.Type
Get
Return GetType(Date)
End Get
End Property

Public Overrides ReadOnly Property DefaultNewRowValue() As Object
Get
Return Date.Now
End Get
End Property

' métodos
Public Sub New()
'....
End Sub

Public Overrides Sub InitializeEditingControl(ByVal rowIndex As Integer, _
ByVal initialFormattedValue As Object, _
ByVal dataGridViewCellStyle As DataGridViewCellStyle)

MyBase.InitializeEditingControl(rowIndex, initialFormattedValue,
dataGridViewCellStyle)

Dim ctlEditorValorCelda As EditorValorCelda =
CType(DataGridView.EditingControl, EditorValorCelda)
Dim colColumnaPersonalizada As ColumnaPersonalizada =
CType(Me.OwningColumn, ColumnaPersonalizada)

ctlEditorValorCelda.Text = initialFormattedValue
End Sub
End Class
'////////////////////////////////

Finalmente crearemos una tercera clase que herede de la clase base
DataGridViewColumn, y que será utilizada por el control para construir la
columna a partir de las celdas personalizadas creadas en las anteriores
clases que hemos escrito.

'////////////////////////////////
Public Class ColumnaPersonalizada
Inherits DataGridViewColumn

' propiedades
Public Overrides Property CellTemplate() As
System.Windows.Forms.DataGridViewCell
Get
Return MyBase.CellTemplate
End Get
Set(ByVal value As System.Windows.Forms.DataGridViewCell)
MyBase.CellTemplate = value
End Set
End Property

'métodos
Public Sub New()
MyBase.New(New CeldaPersonalizada())
End Sub
End Class
'////////////////////////////////

Ya tenemos creada nuestra columna personalizada para el grid, por lo que el
único paso que nos queda es utilizarlo en un formulario al que hayamos
agregado un DataGridView.

'////////////////////////////////
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles MyBase.Load
Dim oConexion As SqlConnection = New SqlConnection()
oConexion.ConnectionString = "Data Source=localhost;" & _
"Initial Catalog=AdventureWorksDW;" & _
"User ID=sa;Password=abc"

Dim oComando As SqlCommand = New SqlCommand("SELECT
CustomerKey,FirstName,LastName,DateFirstPurchase " & _
"FROM DimCustomer", _
oConexion)
Dim oDataAdapter As SqlDataAdapter = New SqlDataAdapter(oComando)
Dim oDataSet As DataSet = New DataSet()
oDataAdapter.Fill(oDataSet, "DimCustomer")

Me.DataGridView1.DataSource = oDataSet
Me.DataGridView1.DataMember = "DimCustomer"

' quitar la columna original que sustituiremos
' por nuestra columna personalizada
Me.DataGridView1.Columns.Remove("DateFirstPurchase")

' crear un objeto de nuestra columna personalizada y añadirlo
' a la colección de columnas del DataGridView
Dim oMCCol As ColumnaPersonalizada = New ColumnaPersonalizada()
oMCCol.Width = 200
oMCCol.HeaderText = "Fecha primera compra"
oMCCol.DataPropertyName = "DateFirstPurchase"
Me.DataGridView1.Columns.Add(oMCCol)
End Sub
'////////////////////////////////

Y básicamente esto sería todo, en función del tipo de control que quieras
utilizar para realizar la edición del valor es posible que tengas que hacer
algunos ajustes en el código.

Espero que te sea de utilidad.

--
Un saludo
Luis Miguel Blanco
http://www.dotnetmania.com

Luis Miguel Blanco

unread,
Nov 24, 2007, 5:30:01 AM11/24/07
to
Hola de nuevo Diego

Además del ejemplo anterior que te he enviado para incluir un control
DateTimePicker en las celdas del DataGridView, te acompaño este otro en el
que se emplea esta vez un MaskedTextBox para la misma operación.

'///////////////////////////////////////////
Public Class EditorValorCelda
Inherits MaskedTextBox
Implements IDataGridViewEditingControl

' variables de uso interno
Private nNumeroFila As Integer
Private oDGV As DataGridView
Private bValorCambiado As Boolean = False

' propiedades
Public Property EditingControlDataGridView() As
System.Windows.Forms.DataGridView Implements
System.Windows.Forms.IDataGridViewEditingControl.EditingControlDataGridView
Get
Return oDGV
End Get
Set(ByVal value As System.Windows.Forms.DataGridView)
oDGV = value
End Set
End Property

Public Property EditingControlFormattedValue() As Object Implements
System.Windows.Forms.IDataGridViewEditingControl.EditingControlFormattedValue
Get

Return Me.Text


End Get
Set(ByVal value As Object)

Me.Text = value
End Set
End Property

Return Me.Text
End Function

Protected Overrides Sub OnTextChanged(ByVal e As System.EventArgs)
bValorCambiado = True
Me.EditingControlDataGridView.NotifyCurrentCellDirty(True)
MyBase.OnTextChanged(e)
End Sub

Public Sub PrepareEditingControlForEdit(ByVal selectAll As Boolean)
Implements
System.Windows.Forms.IDataGridViewEditingControl.PrepareEditingControlForEdit
' no es necesario codificar este método
End Sub
End Class

MyBase.InitializeEditingControl(rowIndex, initialFormattedValue,
dataGridViewCellStyle)

ctlEditorValorCelda.Mask = colColumnaPersonalizada.Mascara


ctlEditorValorCelda.Text = initialFormattedValue
End Sub
End Class

Public Class ColumnaPersonalizada
Inherits DataGridViewColumn

Private msMascara As String

' propiedades
Public Overrides Property CellTemplate() As
System.Windows.Forms.DataGridViewCell
Get
Return MyBase.CellTemplate
End Get
Set(ByVal value As System.Windows.Forms.DataGridViewCell)
MyBase.CellTemplate = value
End Set
End Property

Public Property Mascara() As String
Get
Return msMascara
End Get
Set(ByVal value As String)
msMascara = value
End Set
End Property

'métodos
Public Sub New()
MyBase.New(New CeldaPersonalizada())
End Sub
End Class

'///////////////////////////////////////////

En el código del formulario, solamente tendrías que crear la columna y
asignarle valores a las propiedades correspondientes.

'///////////////////////////////////////////


Dim oMCCol As ColumnaPersonalizada = New ColumnaPersonalizada()
oMCCol.Width = 200

oMCCol.Mascara = "00/00/0000"


oMCCol.HeaderText = "Fecha primera compra"
oMCCol.DataPropertyName = "DateFirstPurchase"
Me.DataGridView1.Columns.Add(oMCCol)

'///////////////////////////////////////////

Espero que cualquiera de estas soluciones te sirvan para resolver el problema.

--
Un saludo
Luis Miguel Blanco
http://www.dotnetmania.com

Diego Romero

unread,
Nov 24, 2007, 11:48:34 AM11/24/07
to
Muchas Gracias !

No se ve tan sencillo, pero voy a intentarlo a ver si puedo.


Diego M Romero

"Luis Miguel Blanco" <LuisMigu...@discussions.microsoft.com> escribió
en el mensaje news:AE8B0459-A28D-426B...@microsoft.com...

Rfloresp

unread,
Dec 6, 2007, 6:36:53 PM12/6/07
to
Hola Luis Miguel,

Antes que otra cosa, Gracias por tu APorte, me ha sido muy útil.

Por otro lado, en específico el ejemplo del MaskTextBox, como validar
la fecha introducida, pues en el ejemplo que Tuviste a Bien compartir
cuando capturo "Erroneamente" fechas no validas me manda un error.

La pregunta es, como y donde implementar esa parte dela validación??

De antemano, Gracias.

Raúl Flores
Tepic, Nayarit. Mx.

Sonia Castaneda

unread,
Dec 7, 2007, 2:55:52 AM12/7/07
to


Hola raul mira yo utilizo esto para agregar el estilo:

Dim items As C1.Win.C1TrueDBGrid.ValueItems =
tdg.Columns(2).ValueItems ' el numero de la columna a la cual le
aplicaras el estilo
items.Translate = True
items.CycleOnClick = True
items.Presentation =
C1.Win.C1TrueDBGrid.PresentationEnum.CheckBox ' aqui defines q es lo
quieres
items.Values.Clear()
items.Values.Add(New C1.Win.C1TrueDBGrid.ValueItem("0",
False)) ' unchecked
items.Values.Add(New C1.Win.C1TrueDBGrid.ValueItem("1", True))
' checked


para implemetar llama al metodo:
Private Sub tdg_AfterColUpdate(ByVal sender As Object, ByVal e As
C1.Win.C1TrueDBGrid.ColEventArgs) Handles tdg.AfterColUpdate
Y PARA NO DAR MUCHA VUELTA EN EL CODIGO TE RECOMIENDO
USES EL
IF TDG.COLUMNS().DATACHANGE = TRUE THEN

VALIDAS TU FECHA:


END IF

End Sub

Rfloresp

unread,
Dec 7, 2007, 12:35:26 PM12/7/07
to
Hola Nuevamente Luis Miguel,

Intentaré implementar la opción que me indicas, Gracias!

Por otro lado, hablando del DateTimepicker que metes en
el DataGridView, intenté acceder a la propiedad ShowCheckBox
para mostrar el CheckBox, sin tener suerte con eso.

Se puede acceder a este? y si es así, Cómo hacerlo?

De antemano, nuevamente, Gracias por tu Apoyo!!!

Raúl Flores

Manolo Zepeda

unread,
Jan 10, 2008, 6:45:05 PM1/10/08
to
Que tal Luis Miguel, podrias hacerme el favor de enviarme un ejemplo de esto
a mi correo?espero no sea mucha molestia.

jer...@hotmail.com

Saludos

luiso...@gmail.com

unread,
Apr 14, 2016, 5:14:01 PM4/14/16
to
Que tal, sólo quería agradecer el presente código, estuve buscando bastante esta solución sin que pudiera entender el porqué del código, por lo que no lo pude implementar en mi proyecto hasta que encontré tu publicación. De verdad, muchas gracias.
0 new messages