Hallo Community,
ich habe ein eigenes DatagridViewColumn erstellt. Diese lässt nur erlaubte Zeichen für Hexadezimaldarstellung in angegebener Stringlänge zu...
Mein Problem ist die Property
Wenn ich aber im Designer den Wert dieser Eigenschaft ändern möchte, wird dieser leider nicht aktualisiert und nicht im Designer.vb-Code übernommen
Welche Ursache ist hier verantwortlich? Könnte mir bitte hier von euch wer weiterhelfen...
Ich habe ein Testprojekt dazu angehängt, um diesen Effekt zu zeigen...
Class DataGridViewHexTextboxCell
Class DataGridViewHexTextboxEditingControl
ich habe ein eigenes DatagridViewColumn erstellt. Diese lässt nur erlaubte Zeichen für Hexadezimaldarstellung in angegebener Stringlänge zu...
Mein Problem ist die Property
HexFieldLength
in Zeile #27 (siehe Listing unten). Diese Property ist auch mit Attributen versehen, die auch im Designer funktionieren.Wenn ich aber im Designer den Wert dieser Eigenschaft ändern möchte, wird dieser leider nicht aktualisiert und nicht im Designer.vb-Code übernommen
Welche Ursache ist hier verantwortlich? Könnte mir bitte hier von euch wer weiterhelfen...
Ich habe ein Testprojekt dazu angehängt, um diesen Effekt zu zeigen...
VB.NET-Quellcode
- Public Class DataGridViewHexTextboxColumn
- Inherits DataGridViewColumn
- Public Sub New()
- MyBase.New(New DataGridViewHexTextboxCell())
- End Sub
- ''' <summary>
- ''' sicherstellen, dass die die Zell-Vorlage eine DataGridViewHexTextboxCell ist...
- ''' </summary>
- Public Overrides Property CellTemplate() As DataGridViewCell
- Get
- Return MyBase.CellTemplate
- End Get
- Set(ByVal value As DataGridViewCell)
- If Not (value Is Nothing) AndAlso Not value.GetType().IsAssignableFrom(GetType(DataGridViewHexTextboxCell)) Then
- Throw New InvalidCastException("Must be a DataGridViewHexTextboxCell")
- End If
- MyBase.CellTemplate = value
- End Set
- End Property
- <Browsable(True)>
- <DefaultValue(2)>
- <Category("Verhalten")>
- <Description("Länge des Hex-Strings festlegen...")>
- Public Property HexFieldLength As Integer
- Get
- Return _HexFieldLength
- End Get
- Set(value As Integer)
- _HexFieldLength = value
- DirectCast(MyBase.CellTemplate, DataGridViewHexTextboxCell).MaxInputLength = _HexFieldLength
- End Set
- End Property
- Private _HexFieldLength As Integer
- End Class
Public Class DataGridViewHexTextboxCell
Inherits DataGridViewTextBoxCell
Public Sub New()
Me.Style.Format = "".PadLeft(Me.MaxInputLength, "0"c) 'dieses Datenformat verwenden...
End Sub
''' <summary>
''' den String des Editing-Controls auf den aktuellen Zellwert einstellen...
''' </summary>
Public Overrides Sub InitializeEditingControl(ByVal rowIndex As Integer, ByVal initialFormattedValue As Object, ByVal dataGridViewCellStyle As DataGridViewCellStyle)
MyBase.InitializeEditingControl(rowIndex, initialFormattedValue, dataGridViewCellStyle)
Dim _EditingControl = CType(DataGridView.EditingControl, DataGridViewHexTextboxEditingControl)
Me.MaxInputLength = DirectCast(DataGridView.Columns(DataGridView.CurrentCell.ColumnIndex), DataGridViewHexTextboxColumn).HexFieldLength
If Convert.IsDBNull(Me.Value) Then
_EditingControl.Text = "".PadLeft(Me.MaxInputLength, "0"c)
Else
_EditingControl.Text = Me.Value.ToString
End If
End Sub
''' <summary>
''' den Typ des DataGridViewHexTextboxCell zurückgeben...
''' </summary>
''' <returns></returns>
Public Overrides ReadOnly Property EditType() As Type
Get
Return GetType(DataGridViewHexTextboxEditingControl)
End Get
End Property
''' <summary>
''' den Datentyp von DataGridViewHexTextboxCell zurückgeben...
''' </summary>
Public Overrides ReadOnly Property ValueType() As Type
Get
Return GetType(String)
End Get
End Property
''' <summary>
''' Vorschlagswert bei erstellter neuen Zeile definieren...
''' </summary>
Public Overrides ReadOnly Property DefaultNewRowValue() As Object
Get
Return ""
End Get
End Property
End Class
Inherits DataGridViewTextBoxCell
Public Sub New()
Me.Style.Format = "".PadLeft(Me.MaxInputLength, "0"c) 'dieses Datenformat verwenden...
End Sub
''' <summary>
''' den String des Editing-Controls auf den aktuellen Zellwert einstellen...
''' </summary>
Public Overrides Sub InitializeEditingControl(ByVal rowIndex As Integer, ByVal initialFormattedValue As Object, ByVal dataGridViewCellStyle As DataGridViewCellStyle)
MyBase.InitializeEditingControl(rowIndex, initialFormattedValue, dataGridViewCellStyle)
Dim _EditingControl = CType(DataGridView.EditingControl, DataGridViewHexTextboxEditingControl)
Me.MaxInputLength = DirectCast(DataGridView.Columns(DataGridView.CurrentCell.ColumnIndex), DataGridViewHexTextboxColumn).HexFieldLength
If Convert.IsDBNull(Me.Value) Then
_EditingControl.Text = "".PadLeft(Me.MaxInputLength, "0"c)
Else
_EditingControl.Text = Me.Value.ToString
End If
End Sub
''' <summary>
''' den Typ des DataGridViewHexTextboxCell zurückgeben...
''' </summary>
''' <returns></returns>
Public Overrides ReadOnly Property EditType() As Type
Get
Return GetType(DataGridViewHexTextboxEditingControl)
End Get
End Property
''' <summary>
''' den Datentyp von DataGridViewHexTextboxCell zurückgeben...
''' </summary>
Public Overrides ReadOnly Property ValueType() As Type
Get
Return GetType(String)
End Get
End Property
''' <summary>
''' Vorschlagswert bei erstellter neuen Zeile definieren...
''' </summary>
Public Overrides ReadOnly Property DefaultNewRowValue() As Object
Get
Return ""
End Get
End Property
End Class
Class DataGridViewHexTextboxEditingControl
Inherits TextBox
Implements IDataGridViewEditingControl
Private _DataGridViev As DataGridView
Private _IsValueChanged As Boolean = False
Private _RowIndex As Integer
Private _MaxFieldLength As Integer
Public Sub New()
'das Editcontrol voreinstellen...
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 = value.ToString
End If
End Set
End Property
'''' <summary>
'''' alle Textbox-Eingaben auf Großbuchstaben und definierter Feldlänge umformen
'''' </summary>
Public Function GetEditingControlFormattedValue(ByVal context As DataGridViewDataErrorContexts) As Object Implements IDataGridViewEditingControl.GetEditingControlFormattedValue
Return Me.Text.ToUpper.PadLeft(_MaxFieldLength, "0"c)
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 _RowIndex
End Get
Set(ByVal value As Integer)
_RowIndex = value
End Set
End Property
''' <summary>
''' bestimmte Tastencodes zulassen
''' </summary>
Public Function EditingControlWantsInputKey(ByVal key As Keys, ByVal dataGridViewWantsInputKey As Boolean) As Boolean Implements IDataGridViewEditingControl.EditingControlWantsInputKey
Select Case key And Keys.KeyCode
Case Keys.Left, Keys.Right, Keys.Home, Keys.End, Keys.Back, Keys.Delete
Return True
Case Else
Return False
End Select
End Function
Public Sub PrepareEditingControlForEdit(ByVal selectAll As Boolean) Implements IDataGridViewEditingControl.PrepareEditingControlForEdit
_MaxFieldLength = DirectCast(_DataGridViev(_DataGridViev.CurrentCell.ColumnIndex, _RowIndex), DataGridViewHexTextboxCell).MaxInputLength
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 _DataGridViev
End Get
Set(ByVal value As DataGridView)
_DataGridViev = value
End Set
End Property
Public Property EditingControlValueChanged() As Boolean Implements IDataGridViewEditingControl.EditingControlValueChanged
Get
Return _IsValueChanged
End Get
Set(ByVal value As Boolean)
_IsValueChanged = value
End Set
End Property
Public ReadOnly Property EditingControlCursor() As Cursor Implements IDataGridViewEditingControl.EditingPanelCursor
Get
Return MyBase.Cursor
End Get
End Property
''' <summary>
''' das DataGridView benachrichtigen, wenn sich sich der Inhalt der Zelle geändert hat...
''' </summary>
Protected Overrides Sub OnTextChanged(ByVal e As EventArgs)
_IsValueChanged = True
Me.EditingControlDataGridView.NotifyCurrentCellDirty(True)
MyBase.OnTextChanged(e)
End Sub
''' <summary>
''' Eingabe auf erlaubte Zeichen prüfen
''' </summary>
Protected Overrides Sub OnKeyPress(e As KeyPressEventArgs)
If e.KeyChar <> Microsoft.VisualBasic.ControlChars.Back Then
e.Handled = Not Uri.IsHexDigit(e.KeyChar)
End If
End Sub
End Class
Inherits TextBox
Implements IDataGridViewEditingControl
Private _DataGridViev As DataGridView
Private _IsValueChanged As Boolean = False
Private _RowIndex As Integer
Private _MaxFieldLength As Integer
Public Sub New()
'das Editcontrol voreinstellen...
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 = value.ToString
End If
End Set
End Property
'''' <summary>
'''' alle Textbox-Eingaben auf Großbuchstaben und definierter Feldlänge umformen
'''' </summary>
Public Function GetEditingControlFormattedValue(ByVal context As DataGridViewDataErrorContexts) As Object Implements IDataGridViewEditingControl.GetEditingControlFormattedValue
Return Me.Text.ToUpper.PadLeft(_MaxFieldLength, "0"c)
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 _RowIndex
End Get
Set(ByVal value As Integer)
_RowIndex = value
End Set
End Property
''' <summary>
''' bestimmte Tastencodes zulassen
''' </summary>
Public Function EditingControlWantsInputKey(ByVal key As Keys, ByVal dataGridViewWantsInputKey As Boolean) As Boolean Implements IDataGridViewEditingControl.EditingControlWantsInputKey
Select Case key And Keys.KeyCode
Case Keys.Left, Keys.Right, Keys.Home, Keys.End, Keys.Back, Keys.Delete
Return True
Case Else
Return False
End Select
End Function
Public Sub PrepareEditingControlForEdit(ByVal selectAll As Boolean) Implements IDataGridViewEditingControl.PrepareEditingControlForEdit
_MaxFieldLength = DirectCast(_DataGridViev(_DataGridViev.CurrentCell.ColumnIndex, _RowIndex), DataGridViewHexTextboxCell).MaxInputLength
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 _DataGridViev
End Get
Set(ByVal value As DataGridView)
_DataGridViev = value
End Set
End Property
Public Property EditingControlValueChanged() As Boolean Implements IDataGridViewEditingControl.EditingControlValueChanged
Get
Return _IsValueChanged
End Get
Set(ByVal value As Boolean)
_IsValueChanged = value
End Set
End Property
Public ReadOnly Property EditingControlCursor() As Cursor Implements IDataGridViewEditingControl.EditingPanelCursor
Get
Return MyBase.Cursor
End Get
End Property
''' <summary>
''' das DataGridView benachrichtigen, wenn sich sich der Inhalt der Zelle geändert hat...
''' </summary>
Protected Overrides Sub OnTextChanged(ByVal e As EventArgs)
_IsValueChanged = True
Me.EditingControlDataGridView.NotifyCurrentCellDirty(True)
MyBase.OnTextChanged(e)
End Sub
''' <summary>
''' Eingabe auf erlaubte Zeichen prüfen
''' </summary>
Protected Overrides Sub OnKeyPress(e As KeyPressEventArgs)
If e.KeyChar <> Microsoft.VisualBasic.ControlChars.Back Then
e.Handled = Not Uri.IsHexDigit(e.KeyChar)
End If
End Sub
End Class
Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „VB1963“ ()