Erweiterungsmethode auf Controls angewendet

  • VB.NET

Es gibt 12 Antworten in diesem Thema. Der letzte Beitrag () ist von RodFromGermany.

    Erweiterungsmethode auf Controls angewendet

    Hallo Community!

    VB.NET-Quellcode

    1. <Extension(), DebuggerStepThrough()> _
    2. Public Sub ControlX(Of T As Control)(ctl As T, Optional BackColor As Color = Nothing)
    3. Select Case True
    4. Case TypeOf (ctl) Is TextBox, TypeOf (ctl) Is ComboBox
    5. '
    6. 'irgend etwas
    7. '
    8. Case Else
    9. 'hier nicht zulässig
    10. End Select
    11. End Sub
    12. 'oder
    13. <Extension(), DebuggerStepThrough()> _
    14. Public Sub ControlX(ctl As TextBox, Optional BackColor As Color = Nothing)
    15. End Sub
    16. <Extension(), DebuggerStepThrough()> _
    17. Public Sub ControlX(ctl As ComboBox, Optional BackColor As Color = Nothing)
    18. End Sub

    Ist es möglich, T zum Beispiel nur auf TextBox und ComboBox einzuschränken, oder muss man die Erweiterungsmethode für beide Controls extra schreiben?
    Im obigen 1. Beispiel zeigt die IntelliSense mir die Erweiterungsmethode ControlX für jedes Control an...

    VB1963 schrieb:

    Ist es möglich, T zum Beispiel nur auf TextBox und ComboBox einzuschränken

    Ja, logischerweise so:

    VB.NET-Quellcode

    1. Public Sub ControlX(Of T As TextBox)(ctl As T, Optional BackColor As Color = Nothing)
    2. End Sub
    3. Public Sub ControlX(Of T As ComboBox)(ctl As T, Optional BackColor As Color = Nothing)
    4. End Sub
    Wozu brauchst Du überhaupt den generischen Teil? Es ist doch kein Problem, wenn Du es für jedes Control zulässt.

    VB.NET-Quellcode

    1. Imports System.Runtime.CompilerServices
    2. Module Module1
    3. <Extension()>
    4. Public Sub Test(control As Control, bC As Color)
    5. control.BackColor = bC
    6. End Sub
    7. End Module
    Die Unendlichkeit ist weit. Vor allem gegen Ende. ?(
    Manche Menschen sind gar nicht dumm. Sie haben nur Pech beim Denken. 8o
    Da hatte ich schon verstanden, mir erschließt sich nur der Grund für diese Einschränkung nicht. Darum auch die Frage nach dem generischen Teil, welchen Du weglassen kannst.

    EDIT: Eine Möglichkeit fällt mir dennoch ein. Erstelle Dir eine Ableitung von TextBox, bzw. ComboBox und implementiere ein Interface:

    VB.NET-Quellcode

    1. Public Interface IBackColor
    2. Sub SetBackColor(c As Color)
    3. End Interface


    VB.NET-Quellcode

    1. Public Class ComboBoxCust : Inherits ComboBox : Implements IBackColor
    2. Public Sub SetBackColor(c As Color) Implements IBackColor.SetBackColor
    3. MyBase.BackColor = c
    4. End Sub
    5. End Class


    VB.NET-Quellcode

    1. Public Class TextBoxCust : Inherits TextBox : Implements IBackColor
    2. Public Sub SetBackColor(c As Color) Implements IBackColor.SetBackColor
    3. MyBase.BackColor = c
    4. End Sub
    5. End Class


    VB.NET-Quellcode

    1. Imports System.Runtime.CompilerServices
    2. Module Module1
    3. <Extension()>
    4. Public Sub Test(control As IBackColor, bC As Color)
    5. control.SetBackColor(bC)
    6. End Sub
    7. End Module


    VB.NET-Quellcode

    1. Private Sub Button1_Click_1(sender As Object, e As EventArgs) Handles Button1.Click
    2. TextBoxCust1.Test(Color.Red)
    3. ComboBoxCust1.Test(Color.Gray)
    4. End Sub
    Die Unendlichkeit ist weit. Vor allem gegen Ende. ?(
    Manche Menschen sind gar nicht dumm. Sie haben nur Pech beim Denken. 8o
    Danke, guck ich mir an...

    EDIT:
    @SpaceyX: Das bedeutet aber einen ganz schönen Umfang.
    Ich glaube da ist es doch besser, wenn man die Extension extra für jedes Control angibt und den den darin befindlichen Codeteil in eine extra Sub auslagert...

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

    Du, war nur ein Tipp, wie man es doch hinbiegen kann. Dir schien es ja wichtig zu sein, Kontrolle darüber zu haben, welche Controls die Extension bekommen sollen. :whistling:
    Die Unendlichkeit ist weit. Vor allem gegen Ende. ?(
    Manche Menschen sind gar nicht dumm. Sie haben nur Pech beim Denken. 8o
    @VB1963:: Ab einer gewissen Stufe ist es sowieso sinnvoll, seine eigenen Controls zu erstellen. Da schiebst Du einfach eine eigene Basisklasse dazwischen und fertig.
    Den Austausch kannst Du dann ganz einfach in der FormX.Designer.vb im Editor machen.
    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!