DataGridView Custom Types

  • VB.NET
  • .NET 4.5

Es gibt 11 Antworten in diesem Thema. Der letzte Beitrag () ist von BigBen2003.

    DataGridView Custom Types

    Hallo,

    auf dieser Webseite im Beitrag #10 vom 5.2.2009 um 6:17 Uhr wird u.a. eine Klasse für ein DataGridView CustomType vorgestellt.

    Ich weiß nicht, wie man diese Klasse in einem Projekt einbinden muss, damit dieser "Neue" ColumnType im Designer einer Spalte zugewiesen werden kann.

    Kann jemand mit ein Tip geben?

    Zur Info: Ich nutze Visual Studio 2013.
    In eine neue Code-Datei einfügen, Option-Strict-Off-Fehler beseitigen, compilieren => es ist als DGV-Spalte verfügbar:
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Häufig von mir verwendete Abkürzungen: CEs = control elements (Labels, Buttons, DGVs, ...) und tDS (typisiertes DataSet)
    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht in den Spekulatiusmodus gehen.
    Hallo,

    vielen Dank für die Info.

    Was meinst Du mit "Option Strict Off"-Fehler?

    Wenn im Code die Option Strict auf On oder Off gesetzt wird, werden keine Fehler angezeigt. Auch kann die Ausgabedateí fehlerfrei erstellt werden.

    Nur im Designer wird die Custom-Type nicht aufgelistet.

    Kannst Du mir das Demo-Projekt zur Verfügung stellen? Dann kann ich am ehesten feststelen, wo mein Fehler ist.

    BigBen2003 schrieb:

    Wenn im Code die Option Strict auf On oder Off gesetzt wird, werden keine Fehler angezeigt. Auch kann die Ausgabedateí fehlerfrei erstellt werden.
    Eh, ... nein?

    Ok, es sind nicht alles Option-Strict-On-Fehler (OSO), sondern
    1. Fehler: IsDbNull ist eine Microsoft-VB-Namespace-Geschichte*
    2. Fehler: OSO
    3. und 4. Fehler: siehe erneut *
    * guckst Du beim Thread über empfohlene Einstellungen

    Deinem Projekt fügst Du eine neue, leere Code-Datei hinzu, haust den Klassencode rein, compilierst das Ganze. Nun ist die Klasse ist Teil des Projektes. Auch nach dem Erstellen daran zu sehen, dass in der Toolbox ganz oben jene Spalte als ToolBox-Element aufgelistet wird. Dir ein Demoprojekt zu schicken würde m.E. keinerlei Lernhilfe sein und wird daher von mir abgelehnt - sorry. Es ist schließlich alles an Infos vorhanden.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Häufig von mir verwendete Abkürzungen: CEs = control elements (Labels, Buttons, DGVs, ...) und tDS (typisiertes DataSet)
    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht in den Spekulatiusmodus gehen.
    Hallo,

    jetzt hat es geklappt...

    Der Designer hat allerdings immer den Formularnamen vor dem "neuen" DatagridView-Control-Typ gesetzt:

    VB.NET-Quellcode

    1. Friend WithEvents Password As Form1.DataGridViewPasswordTextBoxColumn


    Wenn im Code die Bezeichnung "Form1." entfernt wird, treten keine Fehler mehr auf. Das geht solange gut, wie keine Änderungen am Formular-Design vorgenommen werden.

    Als Abhilfe wurde die Klasse DataGridViewPasswordTextBoxColumn in einem Namespace zugewiesen:

    VB.NET-Quellcode

    1. Namespace Windows.Forms
    2. Public Class DataGridViewPasswordTextBoxColumn
    3. ...
    4. End Class
    5. End Namespace


    Zusätzlich wurde im Form1 Code eine neue Klasse definiert:

    VB.NET-Quellcode

    1. Class DataGridViewPasswordTextBoxColumn
    2. Inherits Windows.Forms.DataGridViewPasswordTextBoxColumn
    3. End Class


    Und schon ist auch der Compiler zufrieden.

    BigBen2003 schrieb:

    Zusätzlich wurde im Form1 Code eine neue Klasse definiert:
    Dassis ein falscher Fehler.
    Wenn du eine neue Klasse in Form1 deklarierst erhälst du (höchstwahrscheinlich - je nachedem, wie du's gemacht hast) eine eingeschachtelte Klasse.
    Eingeschachtelte Klassen sind etwas sehr spezielles, und hier wohl kaum zielführend.

    Also für Anfänger täte ich sehr empfehlen: Jede Klasse immer in einer eigenen Datei anlegen.
    VisualStudio unterstützt dich auch dabei, wenn du auf "Menu-Projekt-Klasse_Hinzufügen" gehst.
    Hallo,
    nach dem Erstellen des DataGridView-CustomControl kann dieser über den Designer ausgewählt werden.

    Soweit, so gut.

    Sobald allerdings die Userform abgespeichert wird, werden in der Designer-Code-Datei Fehler angezeigt, da hier das neue Custom-Control innerhalb der Form-Klasse gesucht wird.



    Aus dem Grund bin ich erst darauf gekommen, die Klasse zu verschachteln, so wie es vom Designer selbst vorgeschlagen wird.

    Es scheint so, als wenn der Designer selbst bei jedem (Neu-)Erstellen der Designer.vb-Datei bei CustomTypes die Form-Namen vor der Klasse voranstellt.

    Damit sich jemand ein Bild davon machen kann, habe ich die Demo-Projekt-Datei von Visual Studio 2015 als Anhang bereitgestellt:

    FormTest.zip
    In der Form1.Designer.VB gibt es die Zeilen
    Me.Column2 = New Form1.DataGridViewPasswordTextBoxColumn()
    und
    Friend WithEvents Column2 As Form1.DataGridViewPasswordTextBoxColumn
    entferne jeweils das "Form1." in den Zeilen un fertig.
    Schließlich ist DataGridViewPasswordTextBoxColumn eine eigene Klasse und keine geschachtelte Klasse in Form1.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Häufig von mir verwendete Abkürzungen: CEs = control elements (Labels, Buttons, DGVs, ...) und tDS (typisiertes DataSet)
    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht in den Spekulatiusmodus gehen.
    Hallo,

    selbst nach dem Ändern des Namespace tritt der gleiche Fehler auf.

    Folgende Schritte wurden durchgeführt:
    1. Alle vorhandene Form-Objekte entfernt
    2. Ein Neues Form Objekt mit dem Namen "MeinUserForm" erstellt
    3. DataGridView hinzugefügt
    4. Eine Spalte mit dem Typ DataGridViewPasswordTextBoxColumn erstellt
    Bis hierhin alles in Ordnung, kein Fehler wird gemeldet.

    Speichern des neuen Form-Objekts. Nach dem Speichern und Schließen das gleiche Form-Objekt wieder geöffnet.

    Beim Öffnen wird berets eine Fehlermeldung angezeigt, dass der Designer das Form-Objekt nicht öffnen kann:



    Erst nach dem manuellen Ändern der Zeilen 26 und 60 kann der Designer wieder geöffnet werden.

    Nach dem Ändern des Form-Objekts im Designer beginnt das Spielchen wieder von vorn.

    Nachtrag:

    Der Fehler muss irgendwo im Projekt liegen.

    Nachdem ein neues Projekt erstellt wurde, traten diese Fehler nicht mehr auf. :)

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „BigBen2003“ ()

    Hallo,

    vielen Dank für die wertvollenHilfestellungen. Ohne Euch wäre ich längs nicht so weit gekommen!

    Aktuell ist die Situation so, dass der Custom Control im DatagridView gut verwendte werdn kann. Die Werte werden korretkt übernommen. Auch die eigenen Properties werden in den Eigenschaften zum Control vom Designer mit aufgelistet.

    Nun soll beim Bearbeiten des Inhalts ein Toggle-Button rechts eingeblendet werden.

    Dazu wurde folgendes im Code eingesetzt:

    VB.NET-Quellcode

    1. Public Overrides Sub InitializeEditingControl(ByVal rowIndex As Integer,
    2. ByVal initialFormattedValue As Object,
    3. ByVal dataGridViewCellStyle As System.Windows.Forms.DataGridViewCellStyle)
    4. MyBase.InitializeEditingControl(rowIndex, initialFormattedValue, dataGridViewCellStyle)
    5. Dim _TextBox As TextBox = DirectCast(Me.DataGridView.EditingControl, TextBox)
    6. With _TextBox
    7. 'Remember the current password properties of the editing control.
    8. Me.editingControlPasswordChar = .PasswordChar
    9. Me.editingControlUseSystemPasswordChar = .UseSystemPasswordChar
    10. 'Set the new password properties of the editing control.
    11. .PasswordChar = Me._passwordChar
    12. .UseSystemPasswordChar = Me._useSystemPasswordChar
    13. ' Button rechts einblenden
    14. _Button = New ToggleButtonShowHidePassword ' Button
    15. _Button.Text = "..." ' ToDo: Umschalter für Sichtbar und unsichtbare Passwörter erstellen
    16. _Button.Dock = DockStyle.Right
    17. _Button.Visible = False
    18. .Controls.Add(_Button)
    19. AddHandler _TextBox.Enter, AddressOf Textbox_OnEnter
    20. AddHandler _TextBox.Leave, AddressOf Textbox_OnLeave
    21. End With
    22. End Sub
    23. ''' <summary>
    24. ''' Einblenden des Toggle-Buttons Show/Hide Password
    25. ''' </summary>
    26. ''' <param name="sender"></param>
    27. ''' <param name="e"></param>
    28. Protected Sub Textbox_OnEnter(sender As Object, e As EventArgs)
    29. ' ToDo: Angeklickten RowIndex ermitteln
    30. MyBase.OnEnter(rowIndex:=1, throughMouseClick:=True)
    31. _Button.Visible = True
    32. End Sub
    33. ''' <summary>
    34. ''' Ausblenden des Toggle-Buttons Show/Hide Password
    35. ''' </summary>
    36. ''' <param name="sender"></param>
    37. ''' <param name="e"></param>
    38. Protected Sub Textbox_OnLeave(sender As Object, e As EventArgs)
    39. ' ToDo: Angeklickten RowIndex ermitteln
    40. MyBase.OnLeave(rowIndex:=1, throughMouseClick:=True)
    41. _Button.Visible = False
    42. End Sub


    Kurze Erläuterung:
    Beim Initialisieren des Controls wird die Sub InitializeEditingControl aufgerufen.

    Während der Initialisierung wird ein neues Control ToggleButtonShowHidePassword in der Textbox hinzugefügt und am Rechten Rand verankert.

    Nun zu den Events Enter und Leave:


    Muss für eine korrekte Behandlung der Events die Bearbeitung an myBase.Enter bzw. myBase.Leave übergeben werden?
    Diese verlangen in einem Parameter RowIndex die Zeilennummer vom DataGridView.

    Im Sender oder im EventArgs wird diese Angabe nicht enthalten sein.

    Kann mir jemand erklären, wie man die RowIndex ermitteln kann?

    Am enfachsten wäre es, wenn der RowIndex aus der Initialisierungs Sub dem Events Enter bzw. Leave mit übergeben wird. Mir fehlen hierfür die Kenntnisse, um die bestehende Events Enter bzw. Leave ergänzt werden können.

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