Wert aus Event von Child an Parent Formular weiterleiten

  • VB.NET

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

    Wert aus Event von Child an Parent Formular weiterleiten

    Moin,

    vorhanden sind zwei Formulare. Material (Parent) und Favoriten (Child).
    Parent öffnet beim Start eine Instanz des Child Formulars.

    Der Code zeigt den in eine Partial Class ausgegliederten Teil, der für das aktuelle Vorhaben relevant ist.

    InitializeFrmFav() wird in frm_Material_Auswahl.FormShow ausgeführt.

    Beim Doppelklick in das DataGridView in Child soll ID aus dem DoubleClickEvent an Parent übergeben werden.
    Dabei soll Child nicht geschlossen werden, sonst würde ich es anders lösen.

    VB.NET-Quellcode

    1. Option Explicit On
    2. Option Strict On
    3. Partial Public Class frm_Material_Auswahl
    4. Private WithEvents Frm_Favorites As frm_Material_Favorites = Nothing
    5. Private Sub InitializeFrmFav()
    6. If Frm_Favorites Is Nothing Then Frm_Favorites = New frm_Material_Favorites(Login)
    7. With Frm_Favorites
    8. .Size = New Size(500, Me.Owner.Height)
    9. Dim TargetLocation As New Point With {
    10. .Y = Me.Owner.Location.Y,
    11. .X = Me.Owner.Location.X + (Me.Owner.Width - Frm_Favorites.Width)
    12. }
    13. .Location = TargetLocation
    14. .Show(Me)
    15. End With
    16. End Sub
    17. End Class
    18. Partial Public Class frm_Material_Favorites
    19. Private Sub dgv_CellDoubleClick(sender As Object, e As DataGridViewCellEventArgs) Handles dgv_Data.CellDoubleClick
    20. If e.ColumnIndex < 0 OrElse e.RowIndex < 0 Then Exit Sub
    21. With dgv_Data
    22. If .Rows(e.RowIndex).IsNewRow Then Exit Sub
    23. Dim ID = Convert.ToInt32(.Rows(e.RowIndex).Cells(0))
    24. 'ID muss jetzt an frm_Material_Auswahl übergeben werden
    25. End With
    26. End Sub
    27. End Class


    Wie mache ich das am besten?

    Grüße :)
    @BlueLagoonX Mit den geeigneten Event-Arguments kann das Child Informationen vom Parent abholen.
    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!
    @ErfinderDesRades Ich habe mir den Beitrag durchgelesen, sehe aber leider nicht wo und wie ich mein Event deklarieren und auslösen soll.

    Die Funktionsweise von Events/RaiseEvent verstehe ich, habe selber aber noch nie mit selbstgebauten Events gearbeitet und stehe echt auf dem Schlauch.

    Könntest du mir bitte in meinem Code zeigen, wo da was hin muss?
    @BlueLagoonX Hab ich extra einen Beitrag zu gemacht:
    Alles über Events
    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!
    Hat funktioniert, hier mal der fertige Code.

    VB.NET-Quellcode

    1. Option Explicit On
    2. Option Strict On
    3. Public Class SelectionEventArgs : Inherits EventArgs
    4. Public Property SelectedValue As Integer = 0
    5. Sub New()
    6. End Sub
    7. End Class
    8. Partial Public Class frm_Material_Auswahl
    9. Private Property Frm_Favorites As frm_Material_Favorites = Nothing
    10. Private Sub InitializeFrmFav()
    11. If Frm_Favorites Is Nothing Then Frm_Favorites = New frm_Material_Favorites(Login)
    12. With Frm_Favorites
    13. .Size = New Size(500, Me.Owner.Height)
    14. Dim TargetLocation As New Point With {
    15. .Y = Me.Owner.Location.Y,
    16. .X = Me.Owner.Location.X + (Me.Owner.Width - Frm_Favorites.Width)
    17. }
    18. .Location = TargetLocation
    19. AddHandler .SelectionEvent, AddressOf FavoriteSelected
    20. .Show(Me)
    21. End With
    22. End Sub
    23. Private Sub FavoriteSelected(sender As Object, e As SelectionEventArgs)
    24. Dim Matches = From q In Me.Login.Material Where q.ArtikelNummer.Equals(e.SelectedValue)
    25. If Matches.Any Then
    26. cb_Material.SelectedValue = Matches.First.MaterialBezeichnung
    27. tsb_Accept.PerformClick()
    28. End If
    29. End Sub
    30. End Class
    31. Partial Public Class frm_Material_Favorites
    32. Public Event SelectionEvent(sender As Object, e As SelectionEventArgs)
    33. Private Sub dgv_CellDoubleClick(sender As Object, e As DataGridViewCellEventArgs) Handles dgv_Data.CellDoubleClick
    34. If e.ColumnIndex < 0 OrElse e.RowIndex < 0 Then Exit Sub
    35. With dgv_Data
    36. If .Rows(e.RowIndex).IsNewRow Then Exit Sub
    37. Dim ID = Convert.ToInt32(.Rows(e.RowIndex).Cells(0).Value)
    38. RaiseEvent SelectionEvent(Me, New SelectionEventArgs With {.SelectedValue = ID})
    39. End With
    40. End Sub
    41. End Class
    Das dürfte aber Probleme geben, wenn Du InitializeFrmFav 2x aufrufst. Einmal, weil Frm_Favorites dann nicht Nothing, aber Disposed ist, wenn Du jenes SubForm schließt. Zum anderen, weil nirgends das Gegenstück zu AddHandler auftaucht: RemoveHandler.
    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.