none
Auf eine zur Laufzeit erstellten Form zurückgreifen RRS feed

  • 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
    Donnerstag, 2. Februar 2012 02:08

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
    Donnerstag, 2. Februar 2012 15:17

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
    Donnerstag, 2. Februar 2012 07:10
  • 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 

    Donnerstag, 2. Februar 2012 08:22
  • 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.text

     

     

    such 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
    Donnerstag, 2. Februar 2012 12:27
  • 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
    Donnerstag, 2. Februar 2012 15:17
  • PERFEKT!!!!

     

    Genau das habe ich gesucht.

     

    Vielen Dank für die schnellen Antworten!!!!!

     

    Wünsche noch einen schönen Abend

     

    VG Gab

    Donnerstag, 2. Februar 2012 22:59