Benutzer mit den meisten Antworten
Auf eine zur Laufzeit erstellten Form zurückgreifen

Frage
-
Hallo, hab da mal ne Frage...
Und zwar möchte ich gerne ein Programm schreiben, in dem man je nach Kundenzahl, eine Form beliebig oft öffnen kann.
Für jede Kundschaft benötige ich die gleichen Controls, die ich per Designer in der Form - VA_Auftrag_manuell erstellt habe.
Hat der User jetzt 5 Kundschaften, muss diese Form 5 mal neu geöffnet werden.
Das mache ich wie folgt:
Option Explicit On Public Class VA_Auftrag_manuell Public form() As Form Public nummer As Integer Private Sub VA_Auftrag_manuell_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load ReDim Preserve form(0) nummer = 0 End Sub Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click form(nummer) = New VA_Auftrag_manuell With (form(nummer)) .Name = "form" & nummer .Text = "form" & nummer .Show() End With Me.AddOwnedForm(form(nummer)) End Sub end class
Das funktioniert ja schon mal ganz gut, aber...wie kann ich in der Form(Berechnen) auf die Textbox der form(nummer), z.bsp. form(5).textbox1 zurückgreifen.
Vielen Dank schon mal im vorraus
Gab
nach Me.AddOwnedForm(form(nummer)) kommt noch nummer = nummer+1- Bearbeitet Bluefantasy Donnerstag, 2. Februar 2012 02:09
Antworten
-
Hallo Bluefantasy.
Ich blicke nicht genau durch, wie das mit Deiner Klasse "Berechnen" gemeint ist. Wenn ich das richtig lese, enthält die Klasse "Berechnen" einen Button. Das würde ja bedeuten, dass es sich um ein Formular handelt.
Nochmal neu :-)
-Du hast jetzt eine MDI-Anwendung dessen Haupt-Formular "MDIParent1" heißt und beim Starten Deiner Anwendung angezeigt wird.
-Wenn Du auf einen der ToolStrips NewToolStripMenuItem, NewToolStripButton oder NewWindowToolStripMenuItem klickst, wird eine neues Child-Form angezeigt (in Deinem Beispiel erstmal drei?)
-Auf jedem Child-Form ist eine Textbox.
-Du blendest das Formular "Berechnen" ein, auf dem sich 3 Textboxen befinden und ein Button mit dem momentanen Namen "Button1"
-Du klickst auf "Button1", woraufhin die Texte aus den drei einzelnen Child-Forms-Textboxen in die drei Textboxen des Formulares Berechnen "geholt werden sollen.
Interpretiere ich das so richtig? Falls ja, dann ist vielleicht der folgende Code zumindest ein Ansatz:
Public Class Berechnen Private Sub Button1_Click(sender As Object, e As System.EventArgs) Handles Button1.Click Dim ID As Integer Dim tempStringArray As New System.Collections.Specialized.StringCollection For Each Child As Form1 In MDIApplication1.MDIParent1.MdiChildren tempStringArray.Add(Child.TextBox1.Text) Next For Each c As Control In Me.Controls If TypeOf c Is TextBox Then c.Text = tempStringArray(ID) ID += 1 End If Next End Sub End Class
Bei mir heißt die Anwendung "MDIApplication1". Di müßtest Du dann noch anpassen.
Bei mir ist die Reihenfolge der Texte genau umgedreht. Ich gehe 'mal davon aus, das das nicht unbedingt erwünscht ist. Hoffe trotzdem, dass Dir das erstmal weiterhilft.
VG
Carsten
- Bearbeitet C. Mehnert Donnerstag, 2. Februar 2012 15:19 Unklare Beschreibung
- Als Antwort markiert Bluefantasy Donnerstag, 2. Februar 2012 22:59
Alle Antworten
-
Hallo Bluefantasy,
Du bist nicht so weit entfernt von der Lösung. Wenn die Textbox den Modifier Friend besitzt, muss sie in der Instanz form(5) sichtbar sein. siehe mal hier, Beisp. mit einer Richtextbox
Ich gebe zu, die Richttextbox ist etwas schwer zu finden, weil auch die anderen member der Form Klasse hier zu sehen sind. Du musst mal suchen.
Gruss Ellen
Ich benutze/ I'm using VB2008 & VB2010 -
Hallo Bluefantasy.
Deine Beschreibungen "beliebig oft öffnen" und "für jede Kundschaft benötige ich die gleichen Controls" deuten eigentlich sehr darauf hin, dass für Dein Vorhaben eine MDI-Anwendung geeignet sein könnte. Wenn Du Deiner Anwendung ein Formular hinzufügst, dessen "IsMdiContainer"-Eigenschaft auf "True" einstellst und dieses Formular dann als Startobjekt festlegst, kannst Du mit dem folgenden Code immer neue Child-Formulare erstellen:
Dim NewForm As New VA_Auftrag_manuell NewForm.MdiParent = Me NewForm.Show()
VG
Carsten
-
Hi Carsten,
erstmals vielen Dank für deine Antwort.
Habe probiert deinen Vorschlag umzusetzen, aber es scheitert immer noch am aufrufen der einzelnen Controls.
Habe erstmal ein neues Projekt erstellt. Die Form VA_Manuell ist jetzt die Form1. Habe da eine Textbox reingemacht, nur zum probieren obs funktioniert.
Mein Code...
Option Explicit On Imports System.Windows.Forms Public Class MDIParent1 Private m_ChildFormNumber As Integer Private Sub ShowNewForm(ByVal sender As Object, ByVal e As EventArgs) Handles NewToolStripMenuItem.Click, NewToolStripButton.Click, NewWindowToolStripMenuItem.Click ' Neue Instanz des untergeordneten Formulars erstellen. Dim ChildForm As New Form1 ' Vor der Anzeige dem MDI-Formular unterordnen. ChildForm.MdiParent = Me m_ChildFormNumber += 1 ChildForm.Text = "Fenster " & m_ChildFormNumber ChildForm.Tag = "Fenster" & m_ChildFormNumber ChildForm.Show() End Sub End Class
Ich möchte jetzt, in der Form(Berechnen) auf die einzelnen ChildForm und deren controls zugreifen, z.Bsp fenster2.textbox1.textsuch schon seit ca 3 Stunden nach einer möglichkeit, aber alle bisherigen Ansätze blieben ohne Erfolg.
Hier schon mal ein kleines Beispiel:Habe 3 Fenster geöffnet und in jeder textbox eine andere Zahl reingeschrieben.
Wenn ich jetzt in der Form(Berechnen) auf den Button1 klicke, soll in TextBox1 der text aus Fenste1.Textbox1 stehen, usw.
Public Class Berechnen Public form() As Form Public nummer As Integer Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click ReDim Preserve form(1) nummer = 1 Dim ChildForm As New Form1 Dim count As Integer = MDIParent1.MdiChildren.Count For i As Integer = 1 To count form(nummer) = MDIParent1.MdiChildren(i) nummer = nummer + 1 Next ChildForm = form(1) TextBox1.Text = ChildForm.TextBox1.Text ChildForm = form(2) TextBox2.Text = ChildForm.TextBox1.Text ChildForm = form(3) TextBox3.Text = ChildForm.TextBox1.Text End Sub End Class
- Bearbeitet Bluefantasy Donnerstag, 2. Februar 2012 12:41
-
Hallo Bluefantasy.
Ich blicke nicht genau durch, wie das mit Deiner Klasse "Berechnen" gemeint ist. Wenn ich das richtig lese, enthält die Klasse "Berechnen" einen Button. Das würde ja bedeuten, dass es sich um ein Formular handelt.
Nochmal neu :-)
-Du hast jetzt eine MDI-Anwendung dessen Haupt-Formular "MDIParent1" heißt und beim Starten Deiner Anwendung angezeigt wird.
-Wenn Du auf einen der ToolStrips NewToolStripMenuItem, NewToolStripButton oder NewWindowToolStripMenuItem klickst, wird eine neues Child-Form angezeigt (in Deinem Beispiel erstmal drei?)
-Auf jedem Child-Form ist eine Textbox.
-Du blendest das Formular "Berechnen" ein, auf dem sich 3 Textboxen befinden und ein Button mit dem momentanen Namen "Button1"
-Du klickst auf "Button1", woraufhin die Texte aus den drei einzelnen Child-Forms-Textboxen in die drei Textboxen des Formulares Berechnen "geholt werden sollen.
Interpretiere ich das so richtig? Falls ja, dann ist vielleicht der folgende Code zumindest ein Ansatz:
Public Class Berechnen Private Sub Button1_Click(sender As Object, e As System.EventArgs) Handles Button1.Click Dim ID As Integer Dim tempStringArray As New System.Collections.Specialized.StringCollection For Each Child As Form1 In MDIApplication1.MDIParent1.MdiChildren tempStringArray.Add(Child.TextBox1.Text) Next For Each c As Control In Me.Controls If TypeOf c Is TextBox Then c.Text = tempStringArray(ID) ID += 1 End If Next End Sub End Class
Bei mir heißt die Anwendung "MDIApplication1". Di müßtest Du dann noch anpassen.
Bei mir ist die Reihenfolge der Texte genau umgedreht. Ich gehe 'mal davon aus, das das nicht unbedingt erwünscht ist. Hoffe trotzdem, dass Dir das erstmal weiterhilft.
VG
Carsten
- Bearbeitet C. Mehnert Donnerstag, 2. Februar 2012 15:19 Unklare Beschreibung
- Als Antwort markiert Bluefantasy Donnerstag, 2. Februar 2012 22:59