sender dynamisch verwenden

  • VB.NET

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

    sender dynamisch verwenden

    Guten Abend,

    besteht die Möglichkeit, sender.ToString im Select Case Is Teil zu verwenden?
    Z.B. so Case sender Is "tsmi" & sender.ToString sender.ToString ist in diesem Fall "Vertrag".
    Oder muss ich, um das True zu erreichen, erst den String in ein anderen Typ umwandeln?.

    VB.NET-Quellcode

    1. Private Sub tsmi(sender As Object, e As EventArgs) Handles _
    2. tsmiVertrag.Click,
    3. tsmiVertragsnehmer.Click,
    4. tsmiVertragsgeber.Click,
    5. tsmiVertragspartner.Click
    6. lblTable.Text = sender.ToString
    7. Select Case True
    8. Case sender Is tsmiVertrag : dgvOpenForm.DataSource = VertragBindingSource : tsmiVertrag.BackColor = Color.Aqua
    9. Case sender Is tsmiVertragsnehmer : dgvOpenForm.DataSource = VertragsnehmerBindingSource : tsmiVertragsnehmer.BackColor = Color.Aqua
    10. Case sender Is tsmiVertragsgeber : dgvOpenForm.DataSource = VertragsgeberBindingSource : tsmiVertragsgeber.BackColor = Color.Aqua
    11. Case sender Is tsmiVertragspartner : dgvOpenForm.DataSource = VertragspartnerBindingSource : tsmiVertragspartner.BackColor = Color.Aqua
    12. End Select
    13. End Sub
    Das ist inhaltlich fragwürdig. Sender ist ein Objekt. Das Objekt, welches das Click-Event ausgelöst hat. Also ein ToolStripMenuItem. Wie kann dieses Objekt ein String sein? Worum geht es Dir? Darum, den Namen auszuwerten? Dann caste sender zu Control und schau dessen Namen an. Und wenn ich mir den Code anschaue: Was willst Du dann damit erreichen? Du musst ja trotzdem eine Fallunterscheidung machen. Und wenn Du die TSMIs umbenennst, würde Dein Code nicht mehr mit Stringauswertung funktionieren. Mit der Senderauswertung wie bisher schon, weil die IDE bei Umbenennung auch Deinen Code ändert.
    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.
    Ich nahm an (weil es in VBA so ging), ich könnte anhand des Button Namen also dem sender, dessen String weiterverwenden.
    Also exemplarisch mein sender ist Vertrag und dann daraus den Button tsmiVertrag auslösen ohne dabei alles auszuschreiben sondern einfach in Form von "tsmi" & sender.ToString.

    VB.NET-Quellcode

    1. Select Case True
    2. Case sender is "tsmi" & sender.ToString

    Der Fall würde sich ja bei jedem Click neu unterscheiden, mal der Button mal der Button. Entsprechend fällt der Name immer anders aus. Und umbenennen soll nicht vorkommen.
    1. Wie gesagt, Du kannst: DirectCast(sender, Control).Name
    Allerdings nicht mit mit ToString, sonst erhältst Du bei einem Button z.B.: System.Windows.Forms.Button, Button1
    2.

    Sam85 schrieb:

    Also exemplarisch mein sender ist Vertrag

    Dein sender, also Dein Button heißt Vertrag? Das hoff ich mal nicht. Ich vermute eher, dass Du Deinen Button btnVertrag oder so nennst. Und das würde auch dabei rauskommen, wenn Du das sender-Objekt entsprechend auswertest. Aber laut Deinem Code sind die sender ja z.B. tsmiVertrag. Daher bin ich ein bisken verwirrt.
    3. Wie gesagt, Du solltest nicht.
    Oder geht es Dir um die Beschriftung, die Du auswerten willst, also das, was der Benutzer sieht? Das solltest Du gleich 3x nicht auswerten und für Code hernehmen.

    Sam85 schrieb:

    Und umbenennen soll nicht vorkommen.
    Aber es wird irgendwann kommen. Du willst Dich quasi für die Zukunft selber einschränken und Dir IDE-Unterstützung wegnehmen, um Deinen Code zu kürzen? Hm ... ich rate Dir davon ab.

    Klar, Du kannst es machen. Aber Du zementierst damit Code, der Dich in Deinen Entscheidungen sehr stark einschränkt. Und eines der am häufigsten veränderlichen Komponenten in einem System ist das GUI. Und so sollte es auch sein. Denn wenn Du oder jemand anderes (z.B. Dein Chef?) der Meinung (b)ist: "Ach, das sieht alles besch... aus, ab jetzt wird alles mit nem anderen Menütyp/Bildbuttons/WPF weitergemacht", dann wird Dir der von Dir geplante Code alle Veränderungen verbauen.
    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“ ()

    Sorry ja, der Name ist tsmiVertrag und der Text des Knopfes ist Vertrag...so rum.
    Gut wenn du mir davon abrätst, hat das sicher gute Gründe. Also ist es inhaltlich sicherer, die einzelnen Auswertungen vorzunehmen? Dann belasse ich es so.

    Edit: Ja ich verstehe was du meinst. Da es kein Projekt für meine Arbeit ist, sondern privat zum testen, lernen und ausprobieren, versuche ich nur mein Verständnis zu erweitern. Danke für die Hinweise.

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

    @Sam85 Du kannst Deinen Items im Designer eine Tag-Property mitgeben.
    Im Eventhandler castest Du sender als Control und kannst dann die Tag-Property abfragen.
    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!
    Danke für die Hinweise. Bin nicht sicher ob es so geeignet gelöst ist aber es funktioniert.
    Habe im Designer das Tag Property mit der BindingSource Me.tsmiVertragsgeber.Tag = VertragsgeberBindingSource versehen, das andere habe ich mit dem Text Property gelöst. Hat funktioniert. (Das Property war jetzt natürlich nur exemplarisch für ein ToolStripMenuItem).

    VB.NET-Quellcode

    1. Private Sub tsmi(sender As Object, e As EventArgs) Handles _
    2. tsmiVertrag.Click,
    3. tsmiVertragsnehmer.Click,
    4. tsmiVertragsgeber.Click,
    5. tsmiVertragspartner.Click
    6. For Each item As ToolStripItem In Me.msMain.Items
    7. If item.ToString = DirectCast(sender, ToolStripMenuItem).Text Then
    8. item.BackColor = Color.Aqua
    9. dgvOpenForm.DataSource = DirectCast(sender, ToolStripMenuItem).Tag
    10. Else
    11. item.BackColor = Color.Transparent
    12. End If
    13. Next item
    14. End Sub


    Vorher war es so:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. For Each item As ToolStripItem In Me.msMain.Items
    2. item.BackColor = Color.Transparent
    3. Next
    4. Select Case True
    5. Case sender Is tsmiVertrag : dgvOpenForm.DataSource = VertragBindingSource : tsmiVertrag.BackColor = Color.Aqua
    6. Case sender Is tsmiVertragsnehmer : dgvOpenForm.DataSource = VertragsnehmerBindingSource : tsmiVertragsnehmer.BackColor = Color.Aqua
    7. Case sender Is tsmiVertragsgeber : dgvOpenForm.DataSource = VertragsgeberBindingSource : tsmiVertragsgeber.BackColor = Color.Aqua
    8. Case sender Is tsmiVertragspartner : dgvOpenForm.DataSource = VertragspartnerBindingSource : tsmiVertragspartner.BackColor = Color.Aqua
    9. End Select


    Dieser Beitrag wurde bereits 6 mal editiert, zuletzt von „Sam85“ ()

    Vereinfachung:

    VB.NET-Quellcode

    1. Private Sub tsmi(sender As Object, e As EventArgs) Handles _
    2. tsmiVertrag.Click,
    3. tsmiVertragsnehmer.Click,
    4. tsmiVertragsgeber.Click,
    5. tsmiVertragspartner.Click
    6. dim clicked = DirectCast(sender, ToolStripItem)
    7. For Each item As ToolStripItem In Me.msMain.Items
    8. If item is clicked Then
    9. item.BackColor = Color.Aqua
    10. dgvOpenForm.DataSource = clicked.Tag
    11. Else
    12. item.BackColor = Color.Transparent
    13. End If
    14. Next item
    15. End Sub