Ereignis Prozedur mit mehreren Sendern

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

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

    Ereignis Prozedur mit mehreren Sendern

    Hi,

    man kann für eine Ereignisprozedur mehrere Sender vereinbaren:

    VB.NET-Quellcode

    1. Private Sub myFields_TextChanged(sender As Object, e As EventArgs) Handles txtDateCreated.TextChanged,
    2. txtInvocationCount.TextChanged,
    3. txtDateInvoked.TextChanged,
    4. txtType.TextChanged,
    5. txtName.TextChanged,
    6. txtURL.TextChanged
    7. 'Standard processing
    8. ...


    Nun möchte ich aber etwa für zwei Textboxes noch eine besondere Anweisung ausführen. Und zwar möchte ich den Text "underlined" anzeigen, wenn es sich um eine URL handelt. So etwas hab ich mir gedacht:

    VB.NET-Quellcode

    1. 'Underline Name and URL if applicable
    2. If ... Then UnderlineTxt(txtName)
    3. If ... Then UnderlineText(txtURL)
    4. End Sub
    5. Private Sub UnderlineTxt(myTextBox As TextBox)
    6. If IsUrl(myTextBox.Text) Then
    7. Dim fu As New Font("Microsoft Sans Serif", 9, FontStyle.Underline)
    8. myTextBox.Font = fu
    9. myTextBox.ForeColor = Color.Blue
    10. Else
    11. Dim fr As New Font("Microsoft Sans Serif", 9, FontStyle.Regular)
    12. myTextBox.Font = fr
    13. myTextBox.ForeColor = SystemColors.WindowText
    14. End If
    15. End Sub


    Tja ... wie die drei Punkte schon anzeigen, frage ich mich, wie ich herausfinden kann, welche Textbox das Event TextChanged ausgelöst hat. Das sollte ja eigentlich im Feld sender zu finden sein !

    Aber sender ist ein Objekt und keine Textbox. Und da sehe ich den Namen der Textbox nicht ! Egal was ich mache ...

    VB.NET-Quellcode

    1. Dim strTestSender As String = sender.ToString
    2. Dim strTestType As String = sender.GetType().ToString
    3. Dim strTest As String = sender.GetType().Name


    Weiß jemand, wie ich den Namen der "feuernden" Textbox herausfinden kann ? Oder noch besser, wie ich das Object sender in eine Textbox umwandeln kann ?

    LG
    Peter

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

    Peter329 schrieb:

    wie ich herausfinden kann, welche Textbox das Event ausgelöst hat.

    VB.NET-Quellcode

    1. If sender Is TextBox1 Then
    2. ' was tun
    3. Else If sender Is TextBox2 Then
    4. ' wieder was tun
    5. End If

    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
    und das ist nicht die optimale Lösung:

    VB.NET-Quellcode

    1. UnderlineTxt(DirectCast(sender, Control))

    Bzw. der vermutlich bessere Ansatz:

    VB.NET-Quellcode

    1. Dim tb As TextBox = TryCast(sender, TextBox)
    2. If tb IsNot Nothing Then UnderlineTxt(tb)


    Die Casts solltest du dir unbedingt aneignen.

    So wie ich es verstanden habe, willst du nicht herausfinden, welche TextBox es war, sondern für die TextBox, die es war, etwas bestimmtes ausführen.

    Viele Grüße
    ~blaze~
    Hi,
    wenn ich mehrrere Controls habe, die den gleichen Handler haben mach ich das immer so:

    VB.NET-Quellcode

    1. Select Case True
    2. Case sender is Control1
    3. 'Tu was
    4. Case sender is Control2
    5. 'Tu was anderes
    6. Case sender is Control3
    7. 'Tu sonstwas
    8. '...
    9. '...
    10. Case Else
    11. End Select

    "Hier könnte Ihre Werbung stehen..."
    @MichaHo

    auch deine Lösung funktioniert. Sie basiert auf dem Lösungsansatz von RFG und baut halt noch einen Select-Case darum. Aber basst scho ! :)

    @blaze

    jau, das mit dem TryCast ist natürlich eine tolle Sache. Sowas hab ich gesucht. Denn das löst auch ein anderes meiner Probleme: ich möchte auf verschiedenen Controls die gleiche Aktion ausführen, z.B. das Control verschieben. Dafür habe ich bisher pro Control eine Routine schreiben müssen, jetzt werde ich versuchen, das auf eine Routine zusammen zu führen. Hier ein Beispiel:

    VB.NET-Quellcode

    1. <DebuggerStepThrough>
    2. Private Sub ShiftControl(ByRef myControl As CheckBox, myShiftX As Integer, myShiftY As Integer, myStateMinimized As Boolean)
    3. 'Shift controls
    4. Dim sig As Integer = 1 'Shift up / right
    5. If myStateMinimized Then sig = -1 'Shift down / left
    6. Dim workLocation As New Point
    7. workLocation = myControl.Location
    8. workLocation.X += (myShiftX * sig)
    9. workLocation.Y += (myShiftY * sig)
    10. myControl.Location = workLocation
    11. End Sub
    12. <DebuggerStepThrough>
    13. Private Sub ShiftControl(ByRef myControl As TextBox, myShiftX As Integer, myShiftY As Integer, myStateMinimized As Boolean)
    14. 'Shift controls
    15. Dim sig As Integer = 1 'Shift up / right
    16. If myStateMinimized Then sig = -1 'Shift down / left
    17. Dim workLocation As New Point
    18. workLocation = myControl.Location
    19. workLocation.X += (myShiftX * sig)
    20. workLocation.Y += (myShiftY * sig)
    21. myControl.Location = workLocation
    22. End Sub


    Das sollte jetzt sehr viel einfacher gehen, wenn ich mich nicht irre ! :)

    Also wie immer, Daumen hoch und recht herzlichen Dank an die Ratgeber. Heute habt ihr meinen Wissenstand wieder ein großes Stück weiter gebracht!

    LG
    Peter
    also die ShiftControl kannste sogar Control-TypÜbergreifend gestalten:

    VB.NET-Quellcode

    1. <DebuggerStepThrough>
    2. Private Sub ShiftControl(myControl As Control, myShiftX As Integer, myShiftY As Integer, myStateMinimized As Boolean)
    3. 'Shift controls
    4. Dim sig As Integer = 1 'Shift up / right
    5. If myStateMinimized Then sig = -1 'Shift down / left
    6. Dim workLocation As New Point
    7. workLocation = myControl.Location
    8. workLocation.X += (myShiftX * sig)
    9. workLocation.Y += (myShiftY * sig)
    10. myControl.Location = workLocation
    11. End Sub
    Damit sind sowohl Texboxen als auch Checkbox abgehandelt, und auch alles annere was von Control erbt.
    Na super, das geht ja sogar noch viel einfacher als ich dachte !

    Klasse, damit ist dieses Problem ohne jeden extra Code für alle in Frage kommenden Controls gelöst.

    Heute ist ein schöner Tag ! :)

    Danke und LG
    Peter