Wie dynamische erzeugte Controls mit dazugehörigen Controls füllen?

  • VB.NET

Es gibt 15 Antworten in diesem Thema. Der letzte Beitrag () ist von RodFromGermany.

    Wie dynamische erzeugte Controls mit dazugehörigen Controls füllen?

    Hallo Liebe Leute,
    ich wollte eine MsgBox positionieren stelle aber fest das das gar nicht so simpel ist. Ich bin nun auf die Idee gekommen selber einen MsgBox zu kreieren und diese mit Labels Buttons usw. zu füllen. Das geht auch mit der dynamischen Erzeugung und mit dem Erstellen von AddHandler für die Buttons was ich aber trotz suchen im Internet und bei YouTube und auch hier im Forum bisher nicht fand ist eine Methode einen dynamisch erzeugten Button einem dynamische erzeugten Panel oder einer Form hinzuzufügen. Ich erstelle also sozusagen immer einzelne Objekte die nicht zusammengehören und nicht zusammen bewegt werden können.
    OK, wenn ich statt einer Form eine Panel verwende geht das (da unten) schon da ja das Panel ja nicht vom User bewegt wird und er es gar nicht mitbekommet das die Buttons nicht Elemente des Panels sind, lieber wäre es mir aber ich bekäme das gleich ordentlich programmiert.
    Hat jemand einen Vorschlag wie man die Elemente zusammenführen kann und möglichst zusammen auch wieder entfernen kann? (Weiter unten noch der Vorschlag von „rokky“ der evtl. einen schnelleren Weg zur einer Lösung weist).

    Private Sub Make_new_form_Click(sender As System.Object, e As System.EventArgs) Handles Make_new_form.Click

    Dim frm As New Form
    frm.Location = New Point(300, 300)
    frm.Height = 300
    frm.Width = 300
    frm.BackColor = Color.Bisque
    frm.TopLevel = False
    Me.Controls.Add(frm)
    frm.Visible = True

    'Button hinzufügen
    Dim Yes_button As New Button
    Yes_button.BackColor = Color.Silver
    Yes_button.Location = New Point(350, 350)
    Yes_button.Text = "YES"
    Me.Controls.Add(Yes_button)
    Yes_button.BringToFront()
    AddHandler Yes_button.Click, AddressOf Yes_button_Click

    End Sub

    Private Sub Yes_button_Click(sender As System.Object, e As System.EventArgs)
    MsgBox("Yes")
    End Sub

    Der Vorschlag von „rokky“ hier im im Forum (21.01.09) funktioniert schon mit einem Problem:
    Private Sub Button3_Click(sender As System.Object, e As System.EventArgs) Handles Button3.Click
    Dim f As New Form
    f.Controls.Add(New Button)
    f.Show()
    End Sub

    Button ist der Form zugehörig und oben links in der neuen Form Aber wie kann ich den Button nun ansprechen also Größe, Farbe usw. ändern?

    MrFreeze schrieb:

    Button ist der Form zugehörig und oben links in der neuen Form Aber wie kann ich den Button nun ansprechen also Größe, Farbe usw. ändern?


    Du hast es doch weiter oben selbst gemacht:

    MrFreeze schrieb:


    VB.NET-Quellcode

    1. Dim Yes_button As New Button
    2. Yes_button.BackColor = Color.Silver
    3. Yes_button.Location = New Point(350, 350)
    4. Yes_button.Text = "YES"
    5. Me.Controls.Add(Yes_button)
    6. Yes_button.BringToFront()
    7. AddHandler Yes_button.Click, AddressOf Yes_button_Click
    Klar das geht auch bestens, aber bewege ich nun die neue Form auf dem der Button zu sehen ist so bewegt sich der Button nicht zusammen mit der Form, er bleibt dann der Stelle wo ich ihn mittels des Codes platziert habe. Die beiden gehören also noch nicht so zusammen wie man es wünschen würde.
    Gr. F.

    MrFreeze schrieb:

    aber
    Pack alles was zusammengehört in ein gemeinsames Panel und behandle dieses.
    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!

    MrFreeze schrieb:

    aber bewege ich nun die neue Form auf dem der Button zu sehen ist so bewegt sich der Button nicht zusammen mit der Form, er bleibt dann der Stelle wo ich ihn mittels des Codes platziert habe


    Ich kann es nicht reproduzieren, bei mir bewegt sich der Button mit der Form (ich kann mir auch nicht vorstellen, warum er es nicht tun sollte). Zeig mal deinen Code.
    Wäre ja toll, habe es noch mal getestet, Button bleibt wo er ist.
    frm ist die 2.te Form die vor der ersten erscheint auf der sich der Button "Make_new_form" befindet.
    Code. d is er:

    Public Class Form1

    Private Sub Make_new_form_Click(sender As System.Object, e As System.EventArgs) Handles Make_new_form.Click

    Dim frm As New Form
    frm.Location = New Point(300, 300)
    frm.Height = 300
    frm.Width = 300
    frm.BackColor = Color.Bisque
    frm.TopLevel = False
    Me.Controls.Add(frm)
    frm.Visible = True

    'Button hinzufügen
    Dim Yes_button As New Button
    Yes_button.BackColor = Color.Silver
    Yes_button.Location = New Point(350, 350)
    Yes_button.Text = "YES"
    Me.Controls.Add(Yes_button)
    Yes_button.BringToFront()
    AddHandler Yes_button.Click, AddressOf Yes_button_Click

    End Sub

    Private Sub Yes_button_Click(sender As System.Object, e As System.EventArgs)
    MsgBox("Yes")
    End Sub

    End Class

    MrFreeze schrieb:

    VB.NET-Quellcode

    1. Yes_button.Location = New Point(350, 350)
    Vergleich mal die Position des Buttons mit der Größe Deiner Form.
    Dies war ein Wink mit dem Zaunspfahl. :thumbsup:
    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!
    Grübel, also der neue Button befindet sich oben links mit viel Platz Drumherum auf der neuen Form. So gesehen finden die schon zusammen.

    Was ich mir noch vorstellen könnte ist die Positionsangabe relativ zur neuen Form anzugeben also nicht wie jetzt:

    Yes_button.Location = New Point(350, 350)

    Sondern irgendwie mit Angabe der Form (frm), habe mit der Syntax schon herum probiert aber noch keine Methode gefunden das mit einzubringen (wenn es denn überhaupt der Weg sein sollte)

    Also ähnlich dem hier: Yes_button.Location = frm(New Point(35, 35))

    Gr. F.
    Danke Danke, aber das mit der dynamisch erzeugten Form geht einfach nicht, bekomme die Elemente z.Z. nicht zusammen. Ich habe aber mal ne Lösung gefunden die womöglich nicht allzu elegant ist aber super funktioniert:
    • Ich erstelle zusätzlich zur ersten Form (Form1) eine weitere Form die ich „MsgBox_form“ nenne
    • Ich rufe diese Form auf und schon erscheint diese mit allen zuvor platzierten Controls an der Stelle wo ich es wünsche
    • Ich betätige einen der Buttons und die Form wird geschlossen zuvor wird von der „MsgBox_form" noch der Text eines Labels in der aufrufenden Form geändert was mir dort als Rückmeldung dient (geht bestimmt auch eleganter mit Hilfe einer Var habe nur noch nicht herausgefunden wie).

    Ich kann also die eigne „MsgBox“ ganz komfortabel wie gewohnt mit allen drum und dran erzeugen und nach Betätigung des Buttons komplett wieder schließen. Wenn gegen diese Methode nichts spricht (?) glaube ich damit ganz gut leben zu können.

    Hier der simple Code:

    Public Class Form1

    Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
    'MsgBox aus zuvor (nicht zur Laufzeit) erzeugter Form aufrufen.
    Msgbox2("Hallo")
    End Sub

    Sub Msgbox2(ByVal text As String)
    MsgBox_form.Label1_msgbx.Text = text

    MsgBox_form.BackColor = Color.Bisque
    MsgBox_form.Location = New Point(300, 300)

    MsgBox_form.Show()
    MsgBox_form.BringToFront()
    End Sub

    End Class


    Und die 2.te Form:

    Public Class MsgBox_form

    Private Sub MsgBox_form_yes_bt_Click(sender As System.Object, e As System.EventArgs) Handles MsgBox_form_yes_bt.Click
    'Rückmeldung an die aufrufende Form mittels Textzuweisung an ein Label.
    Form1.Label1.Text = "YES"
    'MsgBox, Form schliessen
    MsgBox("YES")
    Me.Hide()
    End Sub

    Private Sub MsgBox_form_no_bt_Click(sender As System.Object, e As System.EventArgs) Handles MsgBox_form_no_bt.Click
    'Rückmeldung an die aufrufende Form mittels Textzuweisung an ein Label.
    Form1.Label1.Text = "NO"
    MsgBox("NO")
    'MsgBox, Form schliessen
    Me.Hide()

    End Sub

    End Class
    Wenn ich für die Lösung einer Aufgabe mehrere Programme zur Verfügung habe und ich dann austeste, welches am "stimmigsten" ist (einfach zu bedienen, fehlerfreie Lösung der Aufgabe, durchgängig), dann fliegen meist diejenigen Programme als erstes durchs Testraster, die mit selbstgebauten Message-Boxen gestrickt sind. Das liegt zugegebenermaßen nicht immer an solchen Messageboxen, meist sind noch viele andere Dinge im argen, aber die Schnittmenge zwischen unbrauchbarer Software und Software, die selbstgestrickte Messageboxen verwendet, ist erschreckend groß.

    Das Problem mit solchen Eigenkonstruktionen wird hier auch sehr schön gezeigt: Deine "MessageBox" ist weder Modal, noch kann sie durch direktes Schließen ohne Button ("X") einen plausiblen Wert zurückgeben. Irgendwas, was Standard-Messageboxen schon von Haus aus können, vergisst man immer. Auch wenn du es nicht brauchst, irgendwer da draußen, der dein Programm nutzen soll, nutzt solche Dialoge anders als du und ärgert sich später über den Nicht-Standard, weil du etwas nicht bedacht hast.

    Was ich damit sagen will: Begnüge dich mit dem Standard und verschwende deine Entwicklungsenergie lieber auf die Kernaufgaben deines Programms. Ordentlich genutzte Standard-Messageboxen erscheinen so und da, wo es erwartet wird und sind wiedererkennbar. Ich brauch keine Messagebox, die blau blinkt und - aus welchem Grund auch immer - in einer bestimmten Ecke erscheint.
    Weltherrschaft erlangen: 1%
    Ist dein Problem erledigt? -> Dann markiere das Thema bitte entsprechend.
    Waren Beiträge dieser Diskussion dabei hilfreich? -> Dann klick dort jeweils auf den Hilfreich-Button.
    Danke.
    @Arby
    Ich benutze eigene "MessageBoxen" (Formen mit Meldungen halt), wegen Mehrsprachigkeit. Die Formen werden allerdings nicht dynamisch erstellt (sonst hat es ja keinen Sinn), sondern sind schon da (soooo viele sind es auch nicht). So kann ich den Labels und Textboxen direkt Werte für beide Sprachen mitgeben und brauche keine Sprachdateien...
    Naja, hätte gerne die MsgBox an der Stelle im Fenster wo ich es für sinnvoll erachte also so das nicht beispielsweise Informationen in der Form durch die Msgbox verdeckt werden. Eine MsgBox zu positionieren ist aber wohl auch nicht so schnell mal gemacht deswegen meine Idee eine selber zu stricken. Evt. ist aber der Aufwand das positionieren „hinzubekommen“ besser als das Rad neu zu erfinden, sehe mir das gleich mal genauer an. Hat aber trotzdem Spaß gemacht und mal wieder ne Menge gelernt.
    Danke erst mal für eure Kommentare.
    Gr.F.

    MrFreeze schrieb:

    bekomme die Elemente z.Z. nicht zusammen
    Schreib den Code bei einer im Designer erstellten Form ab.
    Allerdings:

    sonne75 schrieb:

    warum brauchst du dynamisch erstellte Form?

    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!