Combobox.SelectionIndexChanged vs. Combobox.SelectionChangeCommitted Event aus anderer Form heraus auslösen

  • VB.NET
  • .NET (FX) 4.0

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

    Combobox.SelectionIndexChanged vs. Combobox.SelectionChangeCommitted Event aus anderer Form heraus auslösen

    Hallo Forum,

    habe wieder einmal ein Problem, zu dem ich keine Infos hier im Forum oder im Web finde.
    Habe verschieden Comboboxen, deren Events nur feuern sollten, wenn der User ändert. Programmgesteuert (wenn ich die Inhalte anpasse), soll nichts passieren. Funktioniert auch prima mit dem Eventhandler

    VB.NET-Quellcode

    1. Combobox.SelectionChangeCommitted
    .

    Nun möchte ich doch (als Hilfskrücke) aus einem anderen Form heraus de Auswahl in der Combobox verändern. Ich kann nun den gesamten Code zurück auf

    VB.NET-Quellcode

    1. Combobox.SelectionIndexChanged
    umstricken und bei Programmtechnischer Änderung jeweils zuvor einen globalen Parameter setzen, diesen im Event abfragen und dann das Event verlassen oder den Eventhandler jeweils bei programmgesteuerter Veränderung zuerst deaktivieren, ändern und wieder aktivieren.

    Beides gefällt mir nicht, da mit erheblichem Aufwand verbunden und (aus meiner Sicht) unschön. Gibt es eine Möglichkeit das Event

    VB.NET-Quellcode

    1. Combobox.SelectionChangeCommitted
    programmgesteuert auszulösen. Am idealsten noch mit

    VB.NET-Quellcode

    1. Combobox.SelectedValue = X
    .

    Oder vielleicht könnt Ihr mir eine Methode nennen, die viel einfacher ist?

    Bitte die Antworten nicht zu kompliziert gestalten, da ich "Frequentprogrammer" also nur Hobbyprogrammierer bin.

    Vielen Dank im Vorraus.
    Die einfachste Möglichkeit ist den ausgeführten Code in eine eigene Funktion auszugliedern. Dein SelectionChangeComitted ruft dann nur die Funktion auf und übergibt die Auswahl. Wenn die Funktion Public ist, kannst du sie dann auch von einem anderen Form aufrufen und eine Auswahl vorgeben.
    Option strict = on

    If it's stupid and it works it ain't stupid.
    Danke schon einmal für den Tipp. Beim drüber Nachdenken und bei der Formulierung der Antwort fällt mir auf, dass nicht die Events der Comboboxen, sondern die ValueSelected-Zuweisung von einer Unterform auf die Hauptform das Problem ist.

    Habe dazu gestern schon stundenlang gegoogelt und auch viele Antworten (z.B. von RodFromGermany, ErfinderDesRades, ...) gefunden und versucht umzusetzen.
    Leider ist mir der Durchbruch dabei noch nicht gelungen.

    Ich möchte doch nur aus meiner Hauptform (modaler Aufruf)

    VB.NET-Quellcode

    1. Dim F as form = New Subform(Me)
    2. F.ShowDialog(Me)


    und in der Subform:

    VB.NET-Quellcode

    1. private Haupt as Hauptform
    2. public Sub new(byval FormHaupt as Form)
    3. mybase.new()
    4. initialize component
    5. me.Haupt = FormHaupt
    6. end Sub


    den ValueSelected-Wert einer Checkbox auf der Hauptform verändern?!? Leider bekomme ich das mit meinen Programmierkenntnissen nicht auf die Kette.

    Stellem mir sogar die Frage warum die Zeile 1: "Private Haupt as Hauptform" überhaupt nötig ist außer für die Eingabe über IntelliSense.

    Drehe mich im Kreis - wie ein Hamster im Rad. <X || ?( :cursing:

    Frequentprogrammer schrieb:

    Stellem mir sogar die Frage warum die Zeile 1: "Private Haupt as Hauptform" überhaupt nötig ist außer für die Eingabe über IntelliSense.
    Weil sonst Zeile#6 nicht compilieren würde. Allerdings kannst Du Dir das eh sparen, da Du an das Hauptformular auch über Me.Parent rankommen würdest. Aber: Wenn das Subform Änderungen am Hauptform vornehmen soll, dann gibt es 2 Möglichkeiten: Das Subform feuert ein eigenes Event und das Hauptform reagiert darauf oder das Subform bietet eine Public-Variable an, die nach der Zeile mit dem ShowDialog vom Hauptform ausgewertet wird.

    btw: Dein Aufrufcode für's Subform geht in die richtige Richtung - vorausgesetzt, dass Du die Subform-Instanz wieder disposed. Ansonsten:

    VB.NET-Quellcode

    1. Using F As New Subform(Me)
    2. F.ShowDialog(Me)
    3. End Using
    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.
    Hallo VaporiZed,

    vielleicht ist das das Element, das ich nicht verstehe:
    Das Subform feuert ein eigenes Event und das Hauptform reagiert darauf oder das Subform bietet eine Public-Variable an, die nach der Zeile mit dem ShowDialog vom Hauptform ausgewertet wird.


    Ich möchte nicht warten, bis das Subform geschlossen wird, sondern das MainForm soll sofort reagieren - und das tut es eben nicht. Wie sage ich dem Hauptform:

    VB.NET-Quellcode

    1. Hauptform.Combobox.SelectedValue = X
    Mainform-Code

    VB.NET-Quellcode

    1. Public Class Form1
    2. Private Subform As New Form2
    3. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    4. AddHandler Subform.SomethingHappened, AddressOf ChangeCombobox
    5. Subform.ShowDialog(Me)
    6. End Sub
    7. Private Sub ChangeCombobox()
    8. Combobox.SelectedValue = 5
    9. End Sub
    10. Private Sub Form1_FormClosing(sender As Object, e As FormClosingEventArgs) Handles Me.FormClosing
    11. RemoveHandler Subform.SomethingHappened, AddressOf ChangeCombobox
    12. Subform.Dispose()
    13. End Sub
    14. End Class


    Subform

    VB.NET-Quellcode

    1. Public Class Form2
    2. Public Event SomethingHappened()
    3. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    4. RaiseEvent SomethingHappened()
    5. End Sub
    6. End Class

    Man könnte zwar auch im Subform mithilfe des Events klarmachen, welchen Wert die ComboBox im Hauptform annehmen soll. Aber dann sage ich gleich: Fehlkonstruktion. Denn das sollte dem Subform egal sein, was im Hauptform sonst so passiert.
    Für alle, die vorhaben, folgende Info noch zu ergänzen: Ja, man kann auch statt mit AddHandler mit WithEvents arbeiten. Aber nur, wenn's auch inhaltlich sinnvoll wäre.
    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 2 mal editiert, zuletzt von „VaporiZed“ ()

    @Frequentprogrammer Ich würde an das Parent-Fenster ein Event senden.
    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!