Property-Wert wird bei einer benutzerdefiniertem DataGridviewColumn nicht aktualisiert

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 2 Antworten in diesem Thema. Der letzte Beitrag () ist von VB1963.

    Property-Wert wird bei einer benutzerdefiniertem DataGridviewColumn nicht aktualisiert

    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 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 :whistling:

    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

    1. Public Class DataGridViewHexTextboxColumn
    2. Inherits DataGridViewColumn
    3. Public Sub New()
    4. MyBase.New(New DataGridViewHexTextboxCell())
    5. End Sub
    6. ''' <summary>
    7. ''' sicherstellen, dass die die Zell-Vorlage eine DataGridViewHexTextboxCell ist...
    8. ''' </summary>
    9. Public Overrides Property CellTemplate() As DataGridViewCell
    10. Get
    11. Return MyBase.CellTemplate
    12. End Get
    13. Set(ByVal value As DataGridViewCell)
    14. If Not (value Is Nothing) AndAlso Not value.GetType().IsAssignableFrom(GetType(DataGridViewHexTextboxCell)) Then
    15. Throw New InvalidCastException("Must be a DataGridViewHexTextboxCell")
    16. End If
    17. MyBase.CellTemplate = value
    18. End Set
    19. End Property
    20. <Browsable(True)>
    21. <DefaultValue(2)>
    22. <Category("Verhalten")>
    23. <Description("Länge des Hex-Strings festlegen...")>
    24. Public Property HexFieldLength As Integer
    25. Get
    26. Return _HexFieldLength
    27. End Get
    28. Set(value As Integer)
    29. _HexFieldLength = value
    30. DirectCast(MyBase.CellTemplate, DataGridViewHexTextboxCell).MaxInputLength = _HexFieldLength
    31. End Set
    32. End Property
    33. Private _HexFieldLength As Integer
    34. End Class

    Class DataGridViewHexTextboxCell
    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

    Class DataGridViewHexTextboxEditingControl
    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
    Dateien

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „VB1963“ ()

    Funktioniert es wenn du die Function Clone in der Klasse DataGridViewHexTextboxColumn überschreibst? Ich hatte solch auch mal, hatte irgendwo gelesen das man die Funktion überschreiben muss.

    VB.NET-Quellcode

    1. Public Overrides Function Clone() As Object
    2. Dim column As DataGridViewHexTextboxColumn = DirectCast(MyBase.Clone(), DataGridViewHexTextboxColumn)
    3. column.HexFieldLength = _HexFieldLength
    4. Return column
    5. End Function


    Edit: In deinem Sample-Projekt getestet, funktioniert.
    Cloud Computer? Nein Danke! Das ist nur ein weiterer Schritt zur totalen Überwachung.
    „Wer die Freiheit aufgibt, um Sicherheit zu gewinnen, wird am Ende beides verlieren.“
    Benjamin Franklin