none
Zugriff auf Steuerelemente in Usercontrol aus anderer Form RRS feed

  • Frage

  • Hallo, ich habe ein Problem .

    Ich habe eine Tabcontrol in der bei jedem hinzufügen eines tabs das selbe usercontrol hinzugefügt wird. In jeder usercontrol ist eine z.b. eine textbox, dessen inhalt in eine andere form übertragen werden soll ! !

    Bitte um Hilfe!

    Danke im Vorraus!

    Mittwoch, 20. März 2013 15:10

Antworten

  • Ok, so wird das schon um einiges klarer. Wenn du an alle Texte der UserControls heran kommen möchtest brauchst du wie gesagt ersteinmal eine Eigenschaft zum abrufen des Textes im UserControl:

    Public Property TextBoxContent() As String
    	Get
    		Return textBox1.Text
    	End Get
    	Set
    		textBox1.Text = value
    	End Set
    End Property
    

    Dann musst du die Texte nacheinander auslesen. Da Sie alle letzten Endes in eine TB sollen, verknüpfe ich diese mit einem StringBuilder:

        Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
            Dim sb As New StringBuilder()
            For Each t As TabPage In TabControl1.Controls
                sb.AppendLine(DirectCast(t.Controls(0), TextBoxContentControl).TextBoxContent)
                sb.AppendLine() 'Leerzeile einfügen
            Next

            'Gib den Text zurück
            Dim result As String = sb.ToString()
        End Sub

    Nun musst du nur noch den Text zurück geben. Dazu kann man mehrere Wege verwenden. Ich würde eine Eigenschaft in Form2 erstellen, welcher du beim klick auf den Button einen Wert zuweißt. Diesen kannst du dann wieder über eben diese Eigenschaft auselen.

    Wenn du einen 2. Wert hast, den du übertragen musst, dann kannst du genauso vorgehen, du musst halt nur neue Namen für die Eigenscaften nehmen.


    <Code:13/> - Koopakiller [kuːpakɪllɐ]
    Webseite | Code Beispiele | Facebook | Snippets

    • Als Antwort markiert pipsfux3000 Mittwoch, 20. März 2013 16:41
    Mittwoch, 20. März 2013 16:10
    Moderator

Alle Antworten

  • Hallo,

    ich nehme mal an das du WiNForms benutzt. Wenn du einen neuen Tab hinzufügst und dem ein Child gibst, dann musst du ein neues erzeugen, denn jedes mal die selbe Instanz  hinzuzufügen, sonst gibt es nur Fehlverhalten in deiner Anwendung. Erzeuge also für jeden Tab eine eigene Instanz des UserControls. Um an die TextBox heran zu kommen musst du eine Eigenschaft in dem UserControl erzeugen, welche den text anruft bzw. setzt. Nun musst du jede Instanz des UserControls als Variable in der Klasse speichern. Auf diese kannst du dann dynamisch zugreifen. Eine Alternative wäre einfach die Tabs durch zu gehen und dann wiedre über die Controls-Eigenschaft die Instanz des UserControsl abzurufen. Ein kleines Beispiel dazu:

        Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
            Dim tb As New TextBox()
            Dim tp As New TabPage()
            tp.Controls.Add(tb)
            Me.TabControl1.Controls.Add(tp)
        End Sub
    
        Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
            'Ruft den ert der TextBox im markierten Tab ab
            MsgBox(DirectCast(TabControl1.SelectedTab.Controls(0), TextBox).Text)
        End Sub


    <Code:13/> - Koopakiller [kuːpakɪllɐ]
    Webseite | Code Beispiele | Facebook | Snippets

    Mittwoch, 20. März 2013 15:15
    Moderator
  • Vielen dank für die schnelle antwort ich probiere das jetzt mal aus
    Mittwoch, 20. März 2013 15:24
  • Wie verwende ich das jetzt bei einer Public Function

    Mittwoch, 20. März 2013 15:29
  • Ähm, wie genau meinst du das? Den Methoden, die ich gepostet habe, ist es egal wie Sie ausgeführt werden. Hauptsache Sie stehen in der richtigen Klasse. Das einzige was zwingend Öffentlich sein muss ist die Text-Eigenschaft im UserControl (Ich nutzt eine normale TextBox). Damit du auch von außerhalb darauf zugreifen kannst.

    Wenn es noch nicht so ganz klappt, dann poste mal den Code deiner Versuche.


    <Code:13/> - Koopakiller [kuːpakɪllɐ]
    Webseite | Code Beispiele | Facebook | Snippets

    Mittwoch, 20. März 2013 15:32
    Moderator
  • So sieht es gerade bei mir aus:

    In einer Form1 habe ich mehre Buttons:

    z.B. Tab hinzufügen und Text speichern

    Es können Tabs hinzugefügt werden, in denen immer die gleiche UserControl liegt:

    Dim UserControl1 As New UseControl1
            With UserControl1
                .Dock = DockStyle.Fill
                .AutoScroll = True
            End With
            TabControl1.TabPages.Add("Neuer Tab")
            TabControl1.SelectedIndex = TabControl1.TabPages.Count - 1
            TabControl1.SelectedTab.Controls.Add(UserControl1)

    In der UserControl1 liegen verschiedene Steuerelemente z.B. eine TextBox (TextBox1).

    Wenn ich nun mehrere Tabs erstellt habe und in die TextBoxen in den verschiedenen Tabs Text hinzugefügt habe, möchte ich nun nacheinander auf den Inhalt der TextBoxen zugreifen und diesen in eine TextBox in der übergeordneten Form einfügen.

    Das soll funktionieren, mit egal wie vielen Tabs.

    Zudem habe ich in der UserControl1 eine Function, die etwas bestimmtes zurückgibt. Vorzugsweise soll auch dieser Inhalt in eine weitere TextBox in der Hauptform eingefügt werden.

    Mittwoch, 20. März 2013 15:49
  • Ok, so wird das schon um einiges klarer. Wenn du an alle Texte der UserControls heran kommen möchtest brauchst du wie gesagt ersteinmal eine Eigenschaft zum abrufen des Textes im UserControl:

    Public Property TextBoxContent() As String
    	Get
    		Return textBox1.Text
    	End Get
    	Set
    		textBox1.Text = value
    	End Set
    End Property
    

    Dann musst du die Texte nacheinander auslesen. Da Sie alle letzten Endes in eine TB sollen, verknüpfe ich diese mit einem StringBuilder:

        Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
            Dim sb As New StringBuilder()
            For Each t As TabPage In TabControl1.Controls
                sb.AppendLine(DirectCast(t.Controls(0), TextBoxContentControl).TextBoxContent)
                sb.AppendLine() 'Leerzeile einfügen
            Next

            'Gib den Text zurück
            Dim result As String = sb.ToString()
        End Sub

    Nun musst du nur noch den Text zurück geben. Dazu kann man mehrere Wege verwenden. Ich würde eine Eigenschaft in Form2 erstellen, welcher du beim klick auf den Button einen Wert zuweißt. Diesen kannst du dann wieder über eben diese Eigenschaft auselen.

    Wenn du einen 2. Wert hast, den du übertragen musst, dann kannst du genauso vorgehen, du musst halt nur neue Namen für die Eigenscaften nehmen.


    <Code:13/> - Koopakiller [kuːpakɪllɐ]
    Webseite | Code Beispiele | Facebook | Snippets

    • Als Antwort markiert pipsfux3000 Mittwoch, 20. März 2013 16:41
    Mittwoch, 20. März 2013 16:10
    Moderator
  • Jetzt sagt er mir, dass textboxcontentcontrol nicht erkannt wird ?!


    Welche Value ist bei Property -> Set gemeint?
    • Bearbeitet pipsfux3000 Mittwoch, 20. März 2013 16:26
    Mittwoch, 20. März 2013 16:24
  • Damit meinte ich dein  UserControl, es müsste UserControl1 heißen...

    <Code:13/> - Koopakiller [kuːpakɪllɐ]
    Webseite | Code Beispiele | Facebook | Snippets

    Mittwoch, 20. März 2013 16:25
    Moderator