GetType von Objekten abfragen

  • VB.NET

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

    GetType von Objekten abfragen

    Hi,

    wie so oft, muss ich ein bissl ausholen, um mein Problem verständlich zu machen. Ich hoffe, ihr habt ein wenig Geduld mit mir.

    Ich habe eine Form, mit der ich Kalender Einträge editiere. (s. Anhang)

    Das Feld "Info" enthält freien Text, der auch Zeilenvorschübe enthalten kann. Die Zeilenvorschübe sollen wie gewohnt mit ENTER / RETURN einzugeben sein. Und deshalb wähle ich für die Controls "Cancel" und "Accept" keinen "Button", sondern ein "Label". Damit etwa die RETURN Taste nicht "falsch" interpretiert wird. Gleiches Gilt für das Help (?) Control ... da habe ich eine Picture Box gewählt. Meine Form enthält also keine Command Buttons ... und damit wird ENTER / RETURN immer als Zeilenvorschub in der Info Textbox interpretiert.

    Dieses Verhalten der Info Textbox ist sehr angenehm für die Bedienung dieses Fensters.

    Wenn das Label oder die Picture Box "geklickt" werden, führe ich die entsprechende Funktion aus (so als würde es sich um einen stinknormalen Button handeln).

    Das funktioniert soweit alles ohne Probleme.

    Jetzt würde ich aber gern noch den Background der Control etwa hellgrün einfärben, wenn sich der MouseZeiger in das Control bewegt ... und natürlich wird der Background wieder grau, wenn der Mauszeiger das Feld verlässt. Das macht die Bedienung ein bissl intuitiver.

    In meinem angehängten Bildchen ist das Feld "Accept" hellgrün gefärbt (den Mauszeiger sieht man nicht, weil den meine Screenshot Routine verschluckt ... :) )

    So habe ich das kodiert:

    VB.NET-Quellcode

    1. Private Sub ctrlEnter_Click(sender As Object, e As EventArgs) Handles picHelp.MouseEnter,
    2. lblHelpClose.MouseEnter,
    3. lblCancel.MouseEnter,
    4. lblAccept.MouseEnter
    5. If sender.GetType.ToString = "System.Windows.Forms.PictureBox" Then
    6. Dim myPicturebox = DirectCast(sender, PictureBox)
    7. myPicturebox.BackColor = Color.LightGreen
    8. End If
    9. If sender.GetType.ToString = "System.Windows.Forms.Label" Then
    10. Dim myLabel = DirectCast(sender, Label)
    11. myLabel.BackColor = Color.LightGreen
    12. End If
    13. End Sub
    14. Private Sub ctrlLeave_Click(sender As Object, e As EventArgs) Handles picHelp.MouseLeave,
    15. lblHelpClose.MouseLeave,
    16. lblCancel.MouseLeave,
    17. lblAccept.MouseLeave
    18. If sender.GetType.ToString = "System.Windows.Forms.PictureBox" Then
    19. Dim myPicturebox = DirectCast(sender, PictureBox)
    20. myPicturebox.BackColor = SystemColors.Control
    21. End If
    22. If sender.GetType.ToString = "System.Windows.Forms.Label" Then
    23. Dim myLabel = DirectCast(sender, Label)
    24. myLabel.BackColor = SystemColors.Control
    25. End If
    26. End Sub


    Die gute Nachricht: das funktioniert auch so.

    Die schlechte Nachricht: ich habe ziemliche Zweifel, ob man das so im Sinne der reinen Lehre programmieren sollte !

    Vor allem die Abfragen der Gestalt

    VB.NET-Quellcode

    1. If sender.GetType.ToString = "System.Windows.Forms.PictureBox" Then ...


    nähren mein Misstrauen ...

    Ich hab das Gefühl, dass ich hier ziemlich "hausbacken" vorgehe ... :)

    Kann mir einer der Profis unter euch nachsichtig und geduldig sagen, wie man das "richtig" macht ?

    LG
    Peter
    Bilder
    • s 2021-05-09 17-09-467.jpg

      18,17 kB, 478×362, 53 mal angesehen
    @Peter329 Lass Enter den Dialog beenden mit AcceptButton und CancelButton und arbeite mit Ctrl+Enter, wenn Du un der RichTextBox einen Zeilenvorschub haben möchtest.
    Das kann die ganz allein.
    ====
    Typ-Abfragen nicht via String, sondern:

    VB.NET-Quellcode

    1. If Application.OpenForms(i).GetType() = GetType(Form2) Then
    nur mit Deinen Typen.
    docs.microsoft.com/de-de/dotne…5.0#System_Object_GetType
    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!

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

    Danach kannst Du auch zusammenfassen:

    VB.NET-Quellcode

    1. If sender.GetType Is GetType(PictureBox) OrElse sender.GetType Is GetType(Label) Then DirectCast(sender, Control).BackColor = SystemColors.Control
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    probierma so:

    VB.NET-Quellcode

    1. Private Sub ctrlEnter_Click(sender As Object, e As EventArgs) Handles picHelp.MouseEnter,
    2. lblHelpClose.MouseEnter,
    3. lblCancel.MouseEnter,
    4. lblAccept.MouseEnter
    5. Select Case True
    6. Case sender Is picHelp
    7. Dim myPicturebox = DirectCast(sender, PictureBox)
    8. myPicturebox.BackColor = Color.LightGreen
    9. Case sender Is lblHelpClose, sender Is lblCancel, sender Is lblAccept
    10. Dim myLabel = DirectCast(sender, Label)
    11. myLabel.BackColor = Color.LightGreen
    12. End Select
    13. End Sub
    Oder auch gleich so:

    VB.NET-Quellcode

    1. Private Sub ctrlEnter_Click(sender As Object, e As EventArgs) Handles picHelp.MouseEnter,
    2. lblHelpClose.MouseEnter,
    3. lblCancel.MouseEnter,
    4. lblAccept.MouseEnter
    5. Dim ctrlEnter = DirectCast(sender, Control)
    6. ctrlEnter.BackColor = Color.LightGreen
    7. End Sub
    Die zweite Variante hat mit Vererbung zu tun.
    Klar, durch die Handles-Angabe ist ja schon geklärt, welche Controls den EventHandler aufrufen. Muss man ja gar nicht mehr prüfen.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Supi ... jetzt weiß ich wie man GetType() richtig abfragt. :)

    Und ich denke, ich verstehe auch die Lösung von EDR ... Picture Box und Label erben beide von der allgemeineren Klasse Control. Und weil dort die Eigenschaft BackColor festgelegt ist, kann ich auf diese Weise beide Objekte unter einen Hut bringen.

    @RFG: das mit CTRL-ENTER ist schon richtig. Aber - jedenfalls mir geht es so -, dass ich regelmäßig das CTRL vergesse zu drücken ... und dann wird die Form u.U. geschlossen und ich muss sie wieder öffnen. Das ist auf Dauer ziemlich nervig ... und deshalb bevorzuge ich in diesem Fall, die Sache ohne Button zu lösen.

    Ihr habt mir ein ums andere Mal sehr geholfen. Herzlichen Dank !

    LG
    Peter
    Bzgl. GetType() muss ich auch mal einhaken.

    Macht es einen Unterschied, ob man GetType oder TypeOf verwendet?

    VB.NET-Quellcode

    1. If sender Is Nothing OrElse Not sender.GetType Is GetType(DataGridView) Then Exit Sub
    2. If sender Is Nothing OrElse Not TypeOf sender Is DataGridView Then Exit Sub


    Ich stelle derzeit von .GetType() auf TypeOf um, da mir die Syntax optisch besser gefällt.
    Nö. Aber danke für die Erinnerung.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.

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