Überschreiben von Methoden

  • VB.NET

Es gibt 5 Antworten in diesem Thema. Der letzte Beitrag () ist von ErfinderDesRades.

    Überschreiben von Methoden

    Hallo Community

    Ich möchte, dass in einem DataGridView die Enter-Taste wie die Pfeiltaste "-->" funktioniert, also die rechts liegende Zelle ansteuert. Auf msdn.microsoft.com/de-de/vstud…datagridviewkey(v=vs.108) habe ich eine fixfertige Lösung gefunden:

    VB.NET-Quellcode

    1. Public Class CustomDataGridView
    2. Inherits DataGridView
    3. <System.Security.Permissions.UIPermission(System.Security.Permissions.SecurityAction.LinkDemand, Window:=System.Security.Permissions.UIPermissionWindow.AllWindows)> _
    4. Protected Overrides Function ProcessDialogKey(ByVal keyData As Keys) As Boolean
    5. Dim key As Keys = keyData And Keys.KeyCode ' Extract the key code from the key value.
    6. If key = Keys.Enter Then Return Me.ProcessRightKey(keyData) ' Handle the ENTER key as if it were a RIGHT ARROW key.
    7. Return MyBase.ProcessDialogKey(keyData)
    8. End Function
    9. <System.Security.Permissions.SecurityPermission(System.Security.Permissions.SecurityAction.LinkDemand, Flags:=System.Security.Permissions.SecurityPermissionFlag.UnmanagedCode)> _
    10. Protected Overrides Function ProcessDataGridViewKey(ByVal e As System.Windows.Forms.KeyEventArgs) As Boolean
    11. If e.KeyCode = Keys.Enter Then Return Me.ProcessRightKey(e.KeyData) ' Handle the ENTER key as if it were a RIGHT ARROW key.
    12. Return MyBase.ProcessDataGridViewKey(e)
    13. End Function
    14. End Class


    Allerdings habe ich als Anfänger (NOCH!!) keine grosse Ahnung von Vererbung, Parametern, Overrides etc., deshalb meine für Euch ganz einfachen Fragen:

    - Wohin kommt dieser Code? Unterhalb meine Klasse "Public Class Form1"? Oder hinein? Oder ein eigenes Modul?
    - Muss ich die obigen Prozeduren irgendwo aufrufen? Wie/wo? Oder wie "aktiviert" man das Ganze?

    Danke für eure (ausführliche) Starthilfe, Bernhard
    @Grüter Dieser Code kommt in Deine Klasse CustomDataGridView.vb, die Du per Hinzufügen -> Klasse erstellst.
    Feddich.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Hi
    einfache Erklärung: Einfach in eine neue Datei kopieren, kompilieren und dann das DataGridView auf der Form durch ein CustomDataGridView ersetzen (es kann sinnvoll sein, das im Designer-Code zu erledigen. Dazu einfach die unsichtbaren Dateien einblenden und den Typ des DataGridViews umändern).
    vielleicht erklären sich alle Fragen, wenn dir eine Erklärung geliefert wird. Wenn eine Methode mit dem Overridable-Modifikator definiert wird, kann sie überschrieben werden. D.h. Die Methode kann quasi ersetzt werden durch das Verhalten, das in einer erbenden Klasse angegeben wird. Hierzu überschreibt die erbende Klasse die Methode, wodurch alle Aufrufe an die Methode an die abgeleitete Klasse weitergeleitet werden.
    Stell dir vor, es gibt bspw. eine Fertigungsart für beliebig gestaltete Türen. Die Herstellung ist extrem aufwändig oder nicht effizient. Existiert ein Bauplan für eine spezifische Tür, so könnte sie effizient erstellt werden. Liefert man also einen Bauplan für Türen aus Blattgold, so wird das Verhalten (z.B. die BaueTür-Methode) dort überschrieben. Es muss nicht unbedingt aus Effizienzgründen oder dergleichen geschehen, sondern kann z.B. ein Verhalten ummodellieren, wie in deinem Fall, oder erweitern, usw. (z.B. OnClick). Außerdem gibt es noch MustOverride, welches eine Überschreibung als Muss festlegt, im Gegensatz dazu legt Overridable nur fest, dass die Methode überschrieben werden kann. Methoden, die als MustOverride definiert wurden, werden dann als abstrakt bezeichnet.
    Vielleicht kann ich dir noch ein einfacheres, weniger abstraktes Beispiel liefern: Du hast ein DataGridView und möchtest die Enter-Taste dazu umfunktionieren, dass sie als Analogon zur Rechte-Pfeil-Taste fungiert. ;) Das zu überschreibende Verhalten wäre die ProcessDialogKey-Methode, da die für das Bearbeiten von Tastatureingaben zuständig ist. D.h. diese wird in einer Subklasse überschrieben, sodass das Verhalten ersetzt wird. Damit aber nur das Verhalten der Enter-Taste geändert wird, werden sonstige Änderungen wieder an die Basisklasse weitergegeben, damit das Standardverhalten eintritt. Folglich ergibt sich, wenn du ähnlich für die ProcessDataGridViewKey-Methode vorgehst, dein Code.

    Gruß
    ~blaze~

    Grüter schrieb:

    Wohin kommt dieser Code? Unterhalb meine Klasse "Public Class Form1"? Oder hinein? Oder ein eigenes Modul?

    1. Das ist ja eine neue KLasse. Diese erbt von DGV, welche (wenn auch über mehrere Basisklassen) von Control erbt. Erben (Inherit) bedeutet, dass alle Member, sprich Methoden, Felder etc. in der Klasse, die erbt, ebenfalls vorhanden sind. Override bedeutet nun, dass die Funktion, die du definierst, schon in einer Basisklasse existierst, und du jetzt den Inhalt überschreibst. Das Return MyBase. bedetuet, dass hier noch der eigentliche Inhalt der Methode aufgerufen wird, sofern noch nichts returned wurde. (Ist es eine Sub, so steht da kein Return und folglich wird das immer ausgeführt).

    Ich sagte ja, iwo erbt diese Klasse dann auch von Control. Das heißt, du löscht dein DGV von der Form im Designer und ziehst nun das CustomDGV rauf, welches ebenfalls in der Toolbox erscheint sobald du einmal kompiliert hast. Selbe Funktionsweise wie das normale, mit dem Unterschied, dass die beiden Funktionen überschrieben wurden.

    Grüter schrieb:

    Muss ich die obigen Prozeduren irgendwo aufrufen? Wie/wo? Oder wie "aktiviert" man das Ganze?

    Nein. Du könntest natürlich, aber das sind sogennante EventHandler-Methoden. Es sind Methoden, die du ganznormal benutzen könntest, was man aber in der Regel nicht macht, da diese von Events aufgerufen werden. MSDN: Verarbeitet Tasten, wie die TAB-Taste und Pfeiltasten, Escape, die Eingebetaste, die verwendet werden um Dialogfelder zu steuern. Wird also aufgerufen, falls einer dieser Tasten gedrückt wird.

    EDIT: Ich freu mich, dass ich zu langsam war, und es erst bemerke, wenn mein Text fertig ist ^^
    »There's no need to "teach" atheism. It's the natural result of education without indoctrination.« — Ricky Gervais
    Danke an RodFromGermany, ~blaze~ und ThePlexian,

    für eure grosse Mühe, mir das zu erklären. Das wichtigste zuerst: Mit allen drei Antworten zusammen ist es mir gelungen, die Sache so wie gewünscht zum Laufen zu bringen :) . Das "Handling" ist somit also klar.

    Was da mein Code aber genau bewirkt, bin ich mir bewusst, dass ich mich da in die Literatur vertiefen muss. All diese Konzepte von Objektorientiertheit lassen sich nicht in einer Frage bzw. Antwort erledigen. Danke aber nochmals für die Starthilfe.

    Bernhard
    Bin ich beeindruckt. Für'n Anfänger, der noch suchen muss, wohin mit dem Code gleich ein eigenes Control schreiben und funzt - Respekt!

    Was für dich auch sehr wichtig ist, zu lernen, wie man mittm Visualstudio debuggen kann, sich beim Coden assistieren lassen und Informationen recherchieren: Visual-Studio richtig nutzen

    ZB mit Haltepunkten kannst du schon sehr weitreichend herausfinden, was dein Code bewirkt.

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