Ver Mensaje Individual
  #1 (permalink)  
Antiguo 17/01/2008, 17:12
Avatar de juanutcm
juanutcm
Usuario no validado
 
Fecha de Ingreso: marzo-2005
Mensajes: 194
Antigüedad: 20 años
Puntos: 0
Pregunta DateTimePicker en DataGridView

Hola a todos bueno encontre este codigo en otro foro


Cita:
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.E ditingControlDataGridView
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.E ditingControlFormattedVal­ue
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.E ditingControlRowIndex
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.E ditingControlValueChanged
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.E ditingPanelCursor
Get
Return MyBase.Cursor
End Get
End Property

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

' métodos
Public Sub ApplyCellStyleToEditingControl(ByVal dataGridViewCellStyle As
System.Windows.Forms.DataGridViewCellStyle) Implements
System.Windows.Forms.IDataGridViewEditingControl.A pplyCellStyleToEditingCon­trol
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.E ditingControlWantsInputKe­y
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.G etEditingControlFormatted­Value
Return Me.Value.ToString("dd-MM-yyyy")
End Function

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

End Sub

Public Sub PrepareEditingControlForEdit(ByVal selectAll As Boolean)
Implements
System.Windows.Forms.IDataGridViewEditingControl.P repareEditingControlForEd­it
' 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.
--
paso el enlace para quien quiera checarlo:

http://groups.google.es/group/micros...31e102c0d9d65f

bueno mi punto es que este codigo inserta una columna con celdas con formato de datetimepicker... y lo que requiero yo es que cuando le cargue los datos al datagridview :

datagridview.datasource=datatable

se modifique el formato de las celdas de la columna fecha y si tiene datos cargados ese registro muestre la fecha... estuve leyendo el codigo pero no le entiendo mucho ojala que alguien me pueda ayudar ...

desde ahora muchas gracias por sus aportes... y cualquier cosa aqui ando por si no me explique con claridad... y mas detalles