Formübergreifend TextBox befüllen?

  • VB.NET

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

    Formübergreifend TextBox befüllen?

    Moin,

    Ich habe eine Form in der ich div. Namen aus einer ListBox auswähle und mir daraus einen String bastle - nennen wir sie AssignTo-Form
    Diese Form kann von zwei verschiedenen Forms aus aufgerufen werden (1. NewTask-Form und 2.UpdateTask-Form)
    Damit ich die "Parentforms" zuordnen kann, also weiß von wo aus die AssignTo-Form aufgerufen wurde, werden in beiden Forms (NewTask/UpdateTask) die AssignTo-From per:

    VB.NET-Quellcode

    1. ​AssignTo.ShowDialog(Me)

    aufgerufen - so kann ich per "Owner.Name" in der AssignTo-Form herausfinden, von welcher Form aus die AssignTo Form aufgerufen wurde.

    So, wenn jetzt in der AssignTo mein String zsmgebastelt hab (das funktioniert super) soll dieser auf die NewTask-Form respektiver auf die UpdateTask-Form übergeben werden.
    Überlegt habe ichs mir so:

    VB.NET-Quellcode

    1. ​Private Sub btn_ok_Click(sender As Object, e As EventArgs) Handles btn_ok.Click
    2. If Owner.Name = "NewTask" Then
    3. Dim users As String = String.Join(", ", ListBox2.Items.Cast(Of String).ToArray)
    4. NewTask.txt_assign.Text = users
    5. Me.Dispose()
    6. ElseIf Owner.Name = "UpdateTask" Then
    7. Dim users As String = String.Join(", ", ListBox2.Items.Cast(Of String).ToArray)
    8. UpdateTask.txt_assign.Text = users
    9. Me.Dispose()
    10. End If
    11. End Sub


    Das funktioniert bei der NewTask-Form super, bei der UpdateTask-Form tut sich jedoch gar nichts. :(


    Nun habe ich eine Vermutung, die UpdateTask-Form wird vom Hauptmenü nicht einfach per "UpdateTask.ShowDialog()" aus geöffnet, sondern per

    VB.NET-Quellcode

    1. ​Private Sub TaskView_CellContentDoubleClick(sender As Object, e As DataGridViewCellEventArgs) Handles TaskDBDataGridView.CellDoubleClick
    2. TaskDBBindingSource.EditCurrent(Of UpdateTask)()
    3. End Sub

    aufgerufen. Hier bediene ich mich einer Helpers Funktion von @ErfinderDesRades um die angeklickte Row meiner DataGridViews im UpdateTask-Form zu bearbeiten (was auch wunderbar klappt).

    Kanns durch die Funktion jedoch sein, dass der Name der Textbox auf der UpdateTask-Form nicht mehr einfach per UpdateTask.txt_assign.Text = users erreichbar ist?

    PS: wenn ich auf die UpdateTask-Form einen einfachen Button setze, der per txt_assign.Text = "asdf" den Text editiert, funktioniert das wunderbar, nur eben nicht von der AssignTo-Form :(
    Danke!

    Grüße,
    Kevin
    @Viercnt Von der Parent-Form zur Client-Form befüllst Du Properties, von der Client-Form zur Parent-Form sendest Du ein Event.
    Ein Dialog wird nicht mit Me.Dispose() beendet :!:
    Dazu bekommt der OK-Button das DialogResult OK und der OK-Button wird im Dialog zum AcceptButton erkoren.
    Gugst Du hier.
    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!
    @Viercnt So etwa:
    Form1

    VB.NET-Quellcode

    1. Public Class Form1
    2. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    3. Using dlg As New Form2
    4. AddHandler dlg.MyEvent, AddressOf MyEventProcedure
    5. dlg.ShowDialog()
    6. End Using
    7. End Sub
    8. Private Sub MyEventProcedure(sender As Object, e As MyEventArgs)
    9. MessageBox.Show(e.MyText)
    10. End Sub
    11. End Class
    Form2

    VB.NET-Quellcode

    1. Public Class Form2
    2. Public Event MyEvent(sender As Object, e As MyEventArgs)
    3. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    4. RaiseEvent MyEvent(Me, New MyEventArgs("bla"))
    5. End Sub
    6. Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
    7. Me.Close()
    8. End Sub
    9. End Class
    10. Public Class MyEventArgs
    11. Inherits EventArgs
    12. Private Text As String
    13. Public ReadOnly Property MyText As String
    14. Get
    15. Return Me.Text
    16. End Get
    17. End Property
    18. Public Sub New(txt As String)
    19. Me.Text = txt
    20. End Sub
    21. End Class
    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!

    RodFromGermany schrieb:

    @Viercnt So etwa:

    VB.NET-Quellcode

    1. Public Class Form1
    2. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    3. Using dlg As New Form2
    4. AddHandler dlg.MyEvent, AddressOf MyEventProcedure
    5. dlg.ShowDialog()
    6. End Using
    7. End Sub
    8. Private Sub MyEventProcedure(sender As Object, e As MyEventArgs) 'Hier, aufgrund des generischen MyEventArgs bekomme ich die Exception, siehe unten.
    9. MessageBox.Show(e.MyText)
    10. End Sub
    11. End Class



    Da krieg ich ne Exception, dass es "not defined" ist. :(


    PS: Warum muss ichs so umständlich über Events regeln, wenns doch bisher auf normale Art und weise mit bspw. "Form1.TextBox1.Text = "bla"" geklappt hat? Also rein interessehalber :)
    Danke!

    Grüße,
    Kevin
    Man muss nicht über Events gehen.

    Spoiler anzeigen

    Visual Basic-Quellcode

    1. Public Class Form1
    2. Private Sub btnSend_Click(sender As Object, e As EventArgs) Handles btnSend.Click
    3. Using form As New Form2()
    4. form.Textval = Me.tbForm1_Sendtext.Text
    5. Dim dr As DialogResult = form.ShowDialog()
    6. If dr = DialogResult.OK Then
    7. Me.tbForm1_Returned.Text = form.Textval
    8. ElseIf dr = DialogResult.Cancel Then
    9. 'was anners
    10. ElseIf dr = DialogResult.Abort Then
    11. 'Fehelrmeldung
    12. End If
    13. End Using
    14. End Sub
    15. Private Sub btnClose_Click(sender As Object, e As EventArgs) Handles btnClose.Click
    16. Me.Close()
    17. End Sub
    18. End Class



    Spoiler anzeigen

    Visual Basic-Quellcode

    1. Public Class Form2
    2. Private _text As String
    3. Public Property Textval() As String
    4. Get
    5. Return Me.tbForm2.Text
    6. End Get
    7. Set
    8. _text = Value
    9. End Set
    10. End Property
    11. Private Sub Form2_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    12. Me.tbForm2.Text = _text
    13. End Sub
    14. Private Sub btnCloseAndReturn_Click(sender As Object, e As EventArgs) Handles btnCloseAndReturn.Click
    15. Me.DialogResult = System.Windows.Forms.DialogResult.OK
    16. Me.Close()
    17. End Sub
    18. End Class

    Viercnt schrieb:

    PS: Warum muss ichs so umständlich über Events regeln, wenns doch bisher auf normale Art und weise mit bspw. "Form1.TextBox1.Text = "bla"" geklappt hat? Also rein interessehalber
    Das ist objektorientierte Denke: Alle Dinge sollen sich um ihren eigenen Kram kümmern, und nicht um Dinge ausserhalb ihrer Zuständigkeit.
    Wenn meine Blumen vertrocknen, dann lassen sie die Blätter hängen, und es ist an mir, sie zu gießen.
    Ich könnte es nicht brauchen, wenn die Blumen selbst sich am Wasserhahn zu schaffen machen.
    Also die Blume ist meine - ich bin der Owner, (und der Wasserhahn ist auch meiner), und es ist meine Zuständigkeit, zu gießen. Der Blume Zuständigkeit ist zu blühen, und bei Trockenheit Blätter hängenzulassen. Dieses Signal empfange ich, und reagiere entsprechend.
    Und so sollte sich das auch zwischen deinen Forms verhalten - was du da vorhast - mit dem Owner abfragen, und in iwelche übergeordnete Forms eingreifen - das ist das pure Chaos.

    Und wie Dksm zeigt, geht das in diesem Fall auch ohne Events, nämlich viel einfacher ists, wenn der Aufrufer direkt nach dem Aufruf reagiert, und womöglich sogar einen Rückabewert (DialogResult) auswerten kann.
    @Pasta Jou.

    Viercnt schrieb:

    "not defined"
    Form 1 mit einem Button, Form 2 mit 2 Button, Code einfügen und feddich.
    Was knallt bei Dir wo?
    ===================
    "Form1.TextBox1.Text = "bla"
    funktioniert dann nicht mehr, wenn Du von einer Form mehrere Instanzen benötigst, z.B. bei MDI.
    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“ ()

    Jetzt muss ich auch mal blöd fragen...

    kann man nicht einfach hingehen und die daten direkt an die richtige form senden?

    in Form2

    VB.NET-Quellcode

    1. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    2. form1.textbox.text = "hallo"
    3. End Sub
    Nein! Doch! OHH!

    samson schrieb:

    direkt an die richtige form senden?
    Das ist VB6-Ranz.
    Stell Dir vor, Du hast von Form2 3 Instanzen und willst das von der zweiten an die dritte Instanz senden.
    Verstehe dies.
    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!
    Perfekt, danke Leute :) Mittlerweile funktionierts wie ne 1! :-))


    Eine allerletzte Frage noch:
    Kann ich in meinem DetailDialog der mithilfe der Helpers von @ErfinderDesRades per:

    VB.NET-Quellcode

    1. ​TaskDBBindingSource.EditCurrent(Of UpdateTask)()


    aufgerufen wurde auch irgendwie einen "Delete" Button einbauen, sodass der ausgewählte Eintrag innerhalb des DetailForms gelöscht wird? Wenn ja, wie?
    Danke!

    Grüße,
    Kevin
    Du kannst soviele Buttons reinbasteln wie du willst. Und mit BindingSource.DeleteCurrent() müsste auch iwas passieren.
    Ich bin aber nicht ganz sicher, ob das in jedem Fall problemlos funktioniert.
    Eiglich ist Löschen Sache des übergeordneten Forms, nicht des Dialogs, der den Datensatz grad anzeigt, der dann nicht mehr da ist.