Principales respuestas
Ayuda con la siguiente estrucutrar personalizada de Masktextbox

Pregunta
-
Buenas, tengo el siguiente condigo, pero al momento de incorporarlo en un DatagridView, cada vez que escribo y paso a otra celda se borra la informacion y no queda guardada.
'****************************************************** '****************************************************** '****************************************************** Public Class DataGridViewMaskedTextBox Public Class DataGridViewMaskedTextBoxColumn Inherits DataGridViewColumn Private maskValue As String = "" Public Sub New() MyBase.New(New DataGridViewMaskedTextBoxCell()) End Sub Public Property Mask() As String Get Return Me.maskValue End Get Set(ByVal value As String) Me.maskValue = value End Set End Property Public Overrides Function Clone() As Object Dim col As DataGridViewMaskedTextBoxColumn = CType(MyBase.Clone(), DataGridViewMaskedTextBoxColumn) col.Mask = Me.Mask Return col End Function Public Overrides Property CellTemplate() As DataGridViewCell Get Return MyBase.CellTemplate End Get Set(ByVal value As DataGridViewCell) If Not TypeOf value Is DataGridViewMaskedTextBoxCell Then Throw New InvalidCastException("DataGridViewMaskedTextBoxCell") End If MyBase.CellTemplate = value End Set End Property End Class Public Class DataGridViewMaskedTextBoxCell Inherits DataGridViewTextBoxCell 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 maskedBox As TCalendarEditingControl = CType(Me.DataGridView.EditingControl, TCalendarEditingControl) If Not (maskedBox Is Nothing) Then ' maskedBox.Text = CStr(IIf(Me.Value Is Nothing, "", Me.Value.ToString() Dim column As DataGridViewMaskedTextBoxColumn = CType(Me.OwningColumn, DataGridViewMaskedTextBoxColumn) If Not (column Is Nothing) Then maskedBox.Mask = column.Mask End If End If End Sub Public Overrides ReadOnly Property EditType() As Type Get Return GetType(TCalendarEditingControl) End Get End Property Public Overrides ReadOnly Property ValueType() As Type Get Return GetType(Object) End Get End Property Public Overrides ReadOnly Property DefaultNewRowValue() As Object Get Return MyBase.DefaultNewRowValue End Get End Property End Class Public Class TCalendarEditingControl Inherits MaskedTextBox 'DateTimePicker Implements IDataGridViewEditingControl Private dataGridViewControl As DataGridView Private valueIsChanged As Boolean = False Private rowIndexNum As Integer Public Sub New() Me.Mask = MaskFormat.IncludeLiterals ' Me.CustomFormat = "dd/MM/yy" End Sub Public Property EditingControlFormattedValue() As Object Implements IDataGridViewEditingControl.EditingControlFormattedValue Get Return Me.Text End Get Set(ByVal value As Object) If TypeOf value Is String Then Me.Text = DateTime.Parse(CStr(value)) End If End Set End Property Public Function GetEditingControlFormattedValue(ByVal context As DataGridViewDataErrorContexts) As Object Implements IDataGridViewEditingControl.GetEditingControlFormattedValue Me.Mask = "##/##/####" Return Me.Text End Function Public Sub ApplyCellStyleToEditingControl(ByVal DataGridViewCellStyle As DataGridViewCellStyle) Implements IDataGridViewEditingControl.ApplyCellStyleToEditingControl Me.Font = DataGridViewCellStyle.Font Me.ForeColor = DataGridViewCellStyle.ForeColor Me.BackColor = DataGridViewCellStyle.BackColor End Sub Public Property EditingControlRowIndex() As Integer _ Implements IDataGridViewEditingControl.EditingControlRowIndex Get Return rowIndexNum End Get Set(ByVal value As Integer) rowIndexNum = value End Set End Property Public Function EditingControlWantsInputKey(ByVal key As Keys, ByVal dataGridViewWantsInputKey As Boolean) As Boolean Implements IDataGridViewEditingControl.EditingControlWantsInputKey ' Let the DateTimePicker handle the keys listed. Select Case key 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 Sub PrepareEditingControlForEdit(ByVal selectAll As Boolean) Implements IDataGridViewEditingControl.PrepareEditingControlForEdit ' No preparation needs to be done. End Sub Public ReadOnly Property RepositionEditingControlOnValueChange() As Boolean Implements IDataGridViewEditingControl.RepositionEditingControlOnValueChange Get Return False End Get End Property Public Property EditingControlDataGridView() As DataGridView Implements IDataGridViewEditingControl.EditingControlDataGridView Get Return dataGridViewControl End Get Set(ByVal value As DataGridView) dataGridViewControl = value End Set End Property Public Property EditingControlValueChanged() As Boolean Implements IDataGridViewEditingControl.EditingControlValueChanged Get Return valueIsChanged End Get Set(ByVal value As Boolean) valueIsChanged = value End Set End Property Public ReadOnly Property EditingControlCursor() As Cursor Implements IDataGridViewEditingControl.EditingPanelCursor Get Return MyBase.Cursor End Get End Property End Class
Respuestas
-
La mejor forma de crear un masktextbox dentro de un Datagridview es con el siguiente codigo:
Public Class DataGridViewMaskedTextBoxColumn Inherits DataGridViewColumn 'CellTemplate y especifique el objeto DataGridViewMaskedTextBoxCell 'Llamar al constructor de la clase base Public Sub New() MyBase.New(New DataGridViewMaskedTextBoxCell()) End Sub Private maskValue As String = "" ''' <summary> ''' Valor para aplicar a la propiedad de máscara de MaskedTextBox ''' </summary> Public Property Mask() As String Get Return Me.maskValue End Get Set(ByVal value As String) Me.maskValue = value End Set End Property 'Porque hemos añadido nuevas propiedades, 'Hay una necesidad de reemplazar el 'método Clone Public Overrides Function Clone() As Object Dim col As DataGridViewMaskedTextBoxColumn = DirectCast(MyBase.Clone(), DataGridViewMaskedTextBoxColumn) col.Mask = Me.Mask Return col End Function 'Obteniendo y configurando CellTemplate Public Overrides Property CellTemplate() As DataGridViewCell Get Return MyBase.CellTemplate End Get Set(ByVal value As DataGridViewCell) 'DataGridViewMaskedTextBoxCell solamente 'No se puede establecer en CellTemplate If Not (TypeOf value Is DataGridViewMaskedTextBoxCell) Then Throw New InvalidCastException( "DataGridViewMaskedTextBoxCell mascara no indicada" & "Especificar el tipo") End If MyBase.CellTemplate = value End Set End Property End Class '''<summary> '''Información de texto que se puede editar con MaskedTextBox '''Mostrar en el control DataGridView. ''' </summary> Public Class DataGridViewMaskedTextBoxCell Inherits DataGridViewTextBoxCell Public Sub New() End Sub 'Inicializar control de edición 'Dado que el control de edición también es usado por otra celda o columna, la inicialización es necesaria Public Overrides Sub InitializeEditingControl(ByVal rowIndex As Integer, ByVal initialFormattedValue As Object, ByVal dataGridViewCellStyle As DataGridViewCellStyle) MyBase.InitializeEditingControl(rowIndex, initialFormattedValue, dataGridViewCellStyle) 'Obtener Control de edición Dim maskedBox As DataGridViewMaskedTextBoxEditingControl = TryCast(Me.DataGridView.EditingControl, DataGridViewMaskedTextBoxEditingControl) If maskedBox IsNot Nothing Then 'Establecer texto Dim maskedText As String = TryCast(initialFormattedValue, String) maskedBox.Text = If(maskedText IsNot Nothing, maskedText, "") 'Hacer que las propiedades de las columnas personalizadas reflejen Dim column As DataGridViewMaskedTextBoxColumn = TryCast(Me.OwningColumn, DataGridViewMaskedTextBoxColumn) If column IsNot Nothing Then maskedBox.Mask = column.Mask End If End If End Sub 'Especifique el tipo de control de edición Public Overrides ReadOnly Property EditType() As Type Get Return GetType(DataGridViewMaskedTextBoxEditingControl) End Get End Property 'Especifique el tipo de datos del valor de la celda 'Aquí, es de tipo Objeto 'Dado que es la misma que la clase base Public Overrides ReadOnly Property ValueType() As Type Get Return GetType(Object) End Get End Property 'Especifica el valor predeterminado de celda para la nueva fila de registro Public Overrides ReadOnly Property DefaultNewRowValue() As Object Get Return MyBase.DefaultNewRowValue End Get End Property End Class ''' <summary> ''' Alojado en DataGridViewMaskedTextBoxCell ''' Representa un control MaskedTextBox. ''' </summary> Public Class DataGridViewMaskedTextBoxEditingControl Inherits MaskedTextBox Implements IDataGridViewEditingControl 'DataGridView con control de edición visualizado Private dataGridView As DataGridView 'Fila donde se muestra el control de edición Private rowIndex As Integer '¿El valor de control de edición es diferente del valor de celda? Private valueChanged As Boolean 'Constructor Public Sub New() Me.TabStop = False End Sub '#Region "IDataGridViewEditingControl メンバ" 'Valor de celda cambiado en el control de edición Public Function GetEditingControlFormattedValue( ByVal context As DataGridViewDataErrorContexts) As Object _ Implements IDataGridViewEditingControl.GetEditingControlFormattedValue Return Me.Text End Function 'Valor de celda cambiado en el control de edición Public Property EditingControlFormattedValue() As Object _ Implements IDataGridViewEditingControl.EditingControlFormattedValue Get Return Me.GetEditingControlFormattedValue( DataGridViewDataErrorContexts.Formatting) End Get Set(ByVal value As Object) Me.Text = DirectCast(value, String) End Set End Property 'Aplicar estilo de celda para editar el control 'Ajuste el color de primer plano, el color de fondo, la fuente, etc. del control de edición al estilo de celda Public Sub ApplyCellStyleToEditingControl( ByVal dataGridViewCellStyle As DataGridViewCellStyle) _ Implements IDataGridViewEditingControl.ApplyCellStyleToEditingControl Me.Font = dataGridViewCellStyle.Font Me.ForeColor = dataGridViewCellStyle.ForeColor Me.BackColor = dataGridViewCellStyle.BackColor Select Case dataGridViewCellStyle.Alignment Case DataGridViewContentAlignment.BottomCenter, DataGridViewContentAlignment.MiddleCenter, DataGridViewContentAlignment.TopCenter Me.TextAlign = HorizontalAlignment.Center Exit Select Case DataGridViewContentAlignment.BottomRight, DataGridViewContentAlignment.MiddleRight, DataGridViewContentAlignment.TopRight Me.TextAlign = HorizontalAlignment.Right Exit Select Case Else Me.TextAlign = HorizontalAlignment.Left Exit Select End Select End Sub 'DataGridView con celdas para editar Public Property EditingControlDataGridView() As DataGridView _ Implements IDataGridViewEditingControl.EditingControlDataGridView Get Return Me.dataGridView End Get Set(ByVal value As DataGridView) Me.dataGridView = value End Set End Property 'Índice de fila que se está editando Public Property EditingControlRowIndex() As Integer _ Implements IDataGridViewEditingControl.EditingControlRowIndex Get Return Me.rowIndex End Get Set(ByVal value As Integer) Me.rowIndex = value End Set End Property 'Si el valor ha cambiado '¿El valor de control de edición es diferente del valor de celda? Public Property EditingControlValueChanged() As Boolean _ Implements IDataGridViewEditingControl.EditingControlValueChanged Get Return Me.valueChanged End Get Set(ByVal value As Boolean) Me.valueChanged = value End Set End Property 'Devolver verdadero hará que el control de edición se procese 'Cuando dataGridViewWantsInputKey es True, DataGridView puede procesar Public Function EditingControlWantsInputKey(ByVal keyData As Keys, ByVal dataGridViewWantsInputKey As Boolean) As Boolean _ Implements IDataGridViewEditingControl.EditingControlWantsInputKey 'Cuando se trata de Keys.Left, Right, Home, End, devuelve True 'Si no haces esto, el enfoque cambiará a otra celda con estas teclas Select Case keyData And Keys.KeyCode Case Keys.Right, Keys.[End], Keys.Left, Keys.Home Return True Case Else Return Not dataGridViewWantsInputKey End Select End Function 'Especifique el cursor cuando el cursor del mouse esté sobre el Panel de edición 'EditingPanel es un panel que aloja controles de edición, 'Si el control de edición es más pequeño que la celda, la parte que no sea el control será el panel Public ReadOnly Property EditingPanelCursor() As Cursor _ Implements IDataGridViewEditingControl.EditingPanelCursor Get Return MyBase.Cursor End Get End Property 'Preparar para editar con control 'Seleccionar texto o insertar puntero como final Public Sub PrepareEditingControlForEdit(ByVal selectAll As Boolean) _ Implements IDataGridViewEditingControl.PrepareEditingControlForEdit If selectAll Then Me.SelectAll() Else Me.SelectionStart = Me.TextLength End If End Sub 'Si cambiar la posición de la celda cuando cambia el valor 'Verdadero si el tamaño del control de edición cambia cuando se cambia el valor Public ReadOnly Property RepositionEditingControlOnValueChange() As Boolean _ Implements IDataGridViewEditingControl.RepositionEditingControlOnValueChange Get Return False End Get End Property '#End Region 'Cuando se cambia el valor Protected Overrides Sub OnTextChanged(ByVal e As EventArgs) MyBase.OnTextChanged(e) 'Notificar a DataGridView que el valor ha cambiado Me.valueChanged = True Me.dataGridView.NotifyCurrentCellDirty(True) End Sub End Class
- Editado Poseidon_2511 jueves, 29 de noviembre de 2018 18:40
- Propuesto como respuesta Pablo Rubio viernes, 30 de noviembre de 2018 16:52
- Marcado como respuesta Pablo Rubio lunes, 10 de diciembre de 2018 16:40
Todas las respuestas
-
Hola Poseidon_2511
Gracias por levantar tu consulta en los foros de MSDN. Con respecto a la misma, para darte una mejor atención es necesario que nos brindes de favor un poco más de información acerca del problema que tienes ya sea colocando fragmento de codigo o form.
https://docs.microsoft.com/es-es/dotnet/framework/winforms/controls/walkthrough-working-with-the-maskedtextbox-control
Gracias por usar los foros de MSDN.
Pablo Rubio
____
Por favor recuerde "Marcar como respuesta" las respuestas que hayan resuelto su problema, es una forma común de reconocer a aquellos que han ayudado, y hace que sea más fácil para los otros visitantes encontrar la solución más tarde.
Microsoft ofrece este servicio de forma gratuita, con la finalidad de ayudar a los usuarios y la ampliación de la base de datos de conocimientos relacionados con los productos y tecnologías de Microsoft.
Este contenido es proporcionado "tal cual" y no implica ninguna responsabilidad de parte de Microsoft. -
La mejor forma de crear un masktextbox dentro de un Datagridview es con el siguiente codigo:
Public Class DataGridViewMaskedTextBoxColumn Inherits DataGridViewColumn 'CellTemplate y especifique el objeto DataGridViewMaskedTextBoxCell 'Llamar al constructor de la clase base Public Sub New() MyBase.New(New DataGridViewMaskedTextBoxCell()) End Sub Private maskValue As String = "" ''' <summary> ''' Valor para aplicar a la propiedad de máscara de MaskedTextBox ''' </summary> Public Property Mask() As String Get Return Me.maskValue End Get Set(ByVal value As String) Me.maskValue = value End Set End Property 'Porque hemos añadido nuevas propiedades, 'Hay una necesidad de reemplazar el 'método Clone Public Overrides Function Clone() As Object Dim col As DataGridViewMaskedTextBoxColumn = DirectCast(MyBase.Clone(), DataGridViewMaskedTextBoxColumn) col.Mask = Me.Mask Return col End Function 'Obteniendo y configurando CellTemplate Public Overrides Property CellTemplate() As DataGridViewCell Get Return MyBase.CellTemplate End Get Set(ByVal value As DataGridViewCell) 'DataGridViewMaskedTextBoxCell solamente 'No se puede establecer en CellTemplate If Not (TypeOf value Is DataGridViewMaskedTextBoxCell) Then Throw New InvalidCastException( "DataGridViewMaskedTextBoxCell mascara no indicada" & "Especificar el tipo") End If MyBase.CellTemplate = value End Set End Property End Class '''<summary> '''Información de texto que se puede editar con MaskedTextBox '''Mostrar en el control DataGridView. ''' </summary> Public Class DataGridViewMaskedTextBoxCell Inherits DataGridViewTextBoxCell Public Sub New() End Sub 'Inicializar control de edición 'Dado que el control de edición también es usado por otra celda o columna, la inicialización es necesaria Public Overrides Sub InitializeEditingControl(ByVal rowIndex As Integer, ByVal initialFormattedValue As Object, ByVal dataGridViewCellStyle As DataGridViewCellStyle) MyBase.InitializeEditingControl(rowIndex, initialFormattedValue, dataGridViewCellStyle) 'Obtener Control de edición Dim maskedBox As DataGridViewMaskedTextBoxEditingControl = TryCast(Me.DataGridView.EditingControl, DataGridViewMaskedTextBoxEditingControl) If maskedBox IsNot Nothing Then 'Establecer texto Dim maskedText As String = TryCast(initialFormattedValue, String) maskedBox.Text = If(maskedText IsNot Nothing, maskedText, "") 'Hacer que las propiedades de las columnas personalizadas reflejen Dim column As DataGridViewMaskedTextBoxColumn = TryCast(Me.OwningColumn, DataGridViewMaskedTextBoxColumn) If column IsNot Nothing Then maskedBox.Mask = column.Mask End If End If End Sub 'Especifique el tipo de control de edición Public Overrides ReadOnly Property EditType() As Type Get Return GetType(DataGridViewMaskedTextBoxEditingControl) End Get End Property 'Especifique el tipo de datos del valor de la celda 'Aquí, es de tipo Objeto 'Dado que es la misma que la clase base Public Overrides ReadOnly Property ValueType() As Type Get Return GetType(Object) End Get End Property 'Especifica el valor predeterminado de celda para la nueva fila de registro Public Overrides ReadOnly Property DefaultNewRowValue() As Object Get Return MyBase.DefaultNewRowValue End Get End Property End Class ''' <summary> ''' Alojado en DataGridViewMaskedTextBoxCell ''' Representa un control MaskedTextBox. ''' </summary> Public Class DataGridViewMaskedTextBoxEditingControl Inherits MaskedTextBox Implements IDataGridViewEditingControl 'DataGridView con control de edición visualizado Private dataGridView As DataGridView 'Fila donde se muestra el control de edición Private rowIndex As Integer '¿El valor de control de edición es diferente del valor de celda? Private valueChanged As Boolean 'Constructor Public Sub New() Me.TabStop = False End Sub '#Region "IDataGridViewEditingControl メンバ" 'Valor de celda cambiado en el control de edición Public Function GetEditingControlFormattedValue( ByVal context As DataGridViewDataErrorContexts) As Object _ Implements IDataGridViewEditingControl.GetEditingControlFormattedValue Return Me.Text End Function 'Valor de celda cambiado en el control de edición Public Property EditingControlFormattedValue() As Object _ Implements IDataGridViewEditingControl.EditingControlFormattedValue Get Return Me.GetEditingControlFormattedValue( DataGridViewDataErrorContexts.Formatting) End Get Set(ByVal value As Object) Me.Text = DirectCast(value, String) End Set End Property 'Aplicar estilo de celda para editar el control 'Ajuste el color de primer plano, el color de fondo, la fuente, etc. del control de edición al estilo de celda Public Sub ApplyCellStyleToEditingControl( ByVal dataGridViewCellStyle As DataGridViewCellStyle) _ Implements IDataGridViewEditingControl.ApplyCellStyleToEditingControl Me.Font = dataGridViewCellStyle.Font Me.ForeColor = dataGridViewCellStyle.ForeColor Me.BackColor = dataGridViewCellStyle.BackColor Select Case dataGridViewCellStyle.Alignment Case DataGridViewContentAlignment.BottomCenter, DataGridViewContentAlignment.MiddleCenter, DataGridViewContentAlignment.TopCenter Me.TextAlign = HorizontalAlignment.Center Exit Select Case DataGridViewContentAlignment.BottomRight, DataGridViewContentAlignment.MiddleRight, DataGridViewContentAlignment.TopRight Me.TextAlign = HorizontalAlignment.Right Exit Select Case Else Me.TextAlign = HorizontalAlignment.Left Exit Select End Select End Sub 'DataGridView con celdas para editar Public Property EditingControlDataGridView() As DataGridView _ Implements IDataGridViewEditingControl.EditingControlDataGridView Get Return Me.dataGridView End Get Set(ByVal value As DataGridView) Me.dataGridView = value End Set End Property 'Índice de fila que se está editando Public Property EditingControlRowIndex() As Integer _ Implements IDataGridViewEditingControl.EditingControlRowIndex Get Return Me.rowIndex End Get Set(ByVal value As Integer) Me.rowIndex = value End Set End Property 'Si el valor ha cambiado '¿El valor de control de edición es diferente del valor de celda? Public Property EditingControlValueChanged() As Boolean _ Implements IDataGridViewEditingControl.EditingControlValueChanged Get Return Me.valueChanged End Get Set(ByVal value As Boolean) Me.valueChanged = value End Set End Property 'Devolver verdadero hará que el control de edición se procese 'Cuando dataGridViewWantsInputKey es True, DataGridView puede procesar Public Function EditingControlWantsInputKey(ByVal keyData As Keys, ByVal dataGridViewWantsInputKey As Boolean) As Boolean _ Implements IDataGridViewEditingControl.EditingControlWantsInputKey 'Cuando se trata de Keys.Left, Right, Home, End, devuelve True 'Si no haces esto, el enfoque cambiará a otra celda con estas teclas Select Case keyData And Keys.KeyCode Case Keys.Right, Keys.[End], Keys.Left, Keys.Home Return True Case Else Return Not dataGridViewWantsInputKey End Select End Function 'Especifique el cursor cuando el cursor del mouse esté sobre el Panel de edición 'EditingPanel es un panel que aloja controles de edición, 'Si el control de edición es más pequeño que la celda, la parte que no sea el control será el panel Public ReadOnly Property EditingPanelCursor() As Cursor _ Implements IDataGridViewEditingControl.EditingPanelCursor Get Return MyBase.Cursor End Get End Property 'Preparar para editar con control 'Seleccionar texto o insertar puntero como final Public Sub PrepareEditingControlForEdit(ByVal selectAll As Boolean) _ Implements IDataGridViewEditingControl.PrepareEditingControlForEdit If selectAll Then Me.SelectAll() Else Me.SelectionStart = Me.TextLength End If End Sub 'Si cambiar la posición de la celda cuando cambia el valor 'Verdadero si el tamaño del control de edición cambia cuando se cambia el valor Public ReadOnly Property RepositionEditingControlOnValueChange() As Boolean _ Implements IDataGridViewEditingControl.RepositionEditingControlOnValueChange Get Return False End Get End Property '#End Region 'Cuando se cambia el valor Protected Overrides Sub OnTextChanged(ByVal e As EventArgs) MyBase.OnTextChanged(e) 'Notificar a DataGridView que el valor ha cambiado Me.valueChanged = True Me.dataGridView.NotifyCurrentCellDirty(True) End Sub End Class
- Editado Poseidon_2511 jueves, 29 de noviembre de 2018 18:40
- Propuesto como respuesta Pablo Rubio viernes, 30 de noviembre de 2018 16:52
- Marcado como respuesta Pablo Rubio lunes, 10 de diciembre de 2018 16:40