Jak napisać warunek dla każdego TabPage na PageControl?

0

witam.

Chcialbym napisać instrukcje:

zapisz textbox znajdujacy sie na KAZDYM TABPAGE do pliku index_tabpage.txt
i nie wiem jak się odwołać do "KAZDY ISTNIEJACY TABPAGE", bo chodzi o to że czasem tych tabpage moze być 5, a czasem 100....dlatego program ma sprawdzać ile jest tych tabpage i nastepnie wykonac warunek "dla kazdego istniejacego tabpage"

0

Przejdź po nich w pętli.

0

foreach

0

no wlasnie nie potrafię tego zrobic....

napisalem cos takiego:

        Dim obecny_page As Integer
        obecny_page = 0
        While obecny_page < TabControl1.TabPages.Count





            'tu chcialbym sie odwolac do - TabControl1.TabPages(obecny_page).   a konkretniej do UserControl1.TextBox1.Text ktory zostal umieszczony na kazdym TabPage



            'jezeli niema katalogu, to go stworz
            If (Not System.IO.Directory.Exists("C:\testujemy\tresc")) Then
                System.IO.Directory.CreateDirectory("C:\testujemy\tresc")
            End If

            'zapisujemy tresc posta do pliku
            Dim w As New IO.StreamWriter("C:\testujemy\tresc\tresc" + obecny_page + ".txt")
            w.Write(TextBox1.Text)
            w.Close()

            obecny_page = obecny_page + 1
        End While

ale nie wiem jak sie odwolac do kazdego TextBox1.Text znajdujacego na każdym TabPage (UserControl1)... bo jezeli wpisze po prostu "textbox1" to nie przejdzie....bo każdy TabPage ma takiego samego TextBoxa, więc trzeba to za pomocą TabPage jakoś przejsc ;/

0

Szukałbym w kolekcji TabControl1.TabPages(obecny_page).Controls?

0
somekind napisał(a):

Szukałbym w kolekcji TabControl1.TabPages(obecny_page).Controls?

co mam szukac?
bo mam tam z 3 textboxy....
a potrzeba mi sie odlować do konkretnie TextBox1

@kAzek

0

Przejdź po pozycjach tej kolekcji i znajdź element, w którym właściwość Name wynosi TextBox1.

0
foreach(TabControl tab in tabControl1.TabPages)
            {
                TextBox[] tb = tab.Controls.Find("TextBox1", false) as TextBox[];
            }

Ale to c#, musisz to przekonwertować.

0

o kurcze, to w C# wystarczy tylko tyle?

a ja w VB już całą litanie napisałem i mi nie działa ;/

        Dim obecny_page As Integer
        obecny_page = 0
        While obecny_page < TabControl1.TabPages.Count



            'tu chcialbym sie odwolac do - TabControl1.TabPages(obecny_page).   a konkretniej do TextBox1.Text ktory kazdy page zawiera (dodane za pomoca UserControl1)


            Dim ctrl, ctrl2 As Control
            For Each ctrl In TabControl1.TabPages(obecny_page).Controls
                If TypeOf (ctrl) Is TabPage Then
                    Dim page As TabPage = ctrl
                    For Each ctrl2 In page.Controls
                        If TypeOf (ctrl2) Is TextBox Then
                            Dim box As TextBox = ctrl2
                            If box.Name = "TextBox1" Then
                                'jezeli niema katalogu, to go stworz
                                If (Not System.IO.Directory.Exists("C:\testujemy\tresc")) Then
                                    System.IO.Directory.CreateDirectory("C:\testujemy\tresc")
                                End If


                                'zapisujemy tresc posta do pliku
                                Dim w As New IO.StreamWriter("C:\testujemy\tresc\tresc" + obecny_page + ".txt")
                                w.Write(box.Text)
                                w.Close()


                                obecny_page = obecny_page + 1
                            End If
                        End If
                    Next
                End If

            Next

        End While
1

Nazywasz TextBox'y na każdej zakładce tak samo tylko z końcówka taki sam numer jak indeks zakładki np. TextBox0, TextBox1, TextBox2 itd. i sobie szukasz:

    Private Function GetTextBoxCtrlTextByCtrlName(ParentCtrl As Control, TextBoxName As String) As String
        GetTextBoxCtrlTextByCtrlName = ""
        If ParentCtrl.HasChildren Then
            For Each Ctrl As Control In ParentCtrl.Controls
                If (TypeOf Ctrl Is TextBox) And (Ctrl.Name.Equals(TextBoxName)) Then

                    GetTextBoxCtrlTextByCtrlName = Ctrl.Text
                    Exit Function
                End If
                GetTextBoxCtrlTextByCtrlName = GetTextBoxCtrlTextByCtrlName(Ctrl, TextBoxName)
            Next
        End If
    End Function


    Private Sub ButtonSave_Click(sender As Object, e As EventArgs) Handles Button1.Click
        Const FILE_PATH As String = "d:\testujemy\tresc\"

        If (Not System.IO.Directory.Exists(FILE_PATH)) Then
            System.IO.Directory.CreateDirectory(FILE_PATH)
        End If

        For PageIndex As Integer = 0 To TabControl1.TabCount - 1
            Dim w As New IO.StreamWriter(FILE_PATH + "tresc" + CStr(PageIndex) + ".txt", True)
            w.Write(GetTextBoxCtrlTextByCtrlName(TabControl1.TabPages(PageIndex), "TextBox" + CStr(PageIndex)))
            w.Close()
        Next
    End Sub
0

@kAzek,
przetestowalem Twoj kod,
zapisuje on wylacznie tekst drugiego TabPage...

i kurcze jest tak dziwnie (jak dla mnie) to napisane, ze nie rozumiem, gdzie w tym kodzie ustawiles "name" textboxa, którego funkcja szuka? jak bys mogl to wytlumacz, dziekuje :)

Mi chodzi o to że

TabPage0 - zawiera TextBox1
TabPage1 - zawiera TextBox1
TabPage2 - zawiera TextBox1

i kazdy z tych textboxów mialby sie zapisywac do innego pliku

nie moge nazwac inaczej TextBoxów np TextBox0, TextBox1, TextBox2.....bo tych TextBoxów jest bardzo dużo...... każdy się nazywa TextBox1...bo umiescilem je na UserControl1...
@kAzek

1

Jak to wszystkie TabPage mają TextBox o tej samej nazwie? LOL

w.Write(GetTextBoxCtrlTextByCtrlName(TabControl1.TabPages(PageIndex), "TextBox1"))
0

no stworzylem UserControl1...a nastepnie w trakcie dzialania aplikacji, jak tworzymy nowe TabPages to automatycznie tworzą sie na nich UserControl1, które już zawierają TextBox1....więc każdy TabPage ma tego samego TextBox1....

0

ok wszystko działa :)

to żeby nie zakładać nowego tematu...

chciałbym teraz stworzyć kolejną funkcję - odwrotną do tej.....
zrobić by każdy plik zapisany przez poprzednią funkcję - ładował się do odpowiedniego textboxa
(czyli odwrotność tej funkcji)

by z pliku "tresc1.text" zapisywał zawartosc do Textbox1.Text na zakładce TabPage('tresc1'-'tresc'=1) czyli po prostu TabPage1

tresc2 odpowiednio do TabPage2 , TextBox1
tresc3 odpowiednio do TabPage3 , TextBox1
tresc4 odpowiednio do TabPage4 , TextBox1
@kAzek
dobrze kombinuje?

     Private Sub LoadTextBox(ParentCtrl As Control, Text As String)
        Const FILE_PATH As String = "c:\testujemy\tresc\"
        Dim tekst As String
        tekst = ""
        For PageIndex As Integer = 0 To TabControl1.TabCount - 1
            Dim wq As New IO.StreamReader(FILE_PATH + "tresc" + CStr(PageIndex + 1) + ".txt", True)
            tekst = wq.ReadToEnd()
            wq.Close()



            If ParentCtrl.HasChildren Then
                For Each Ctrl As Control In ParentCtrl.Controls
                    If TypeOf Ctrl Is TextBox And Text.Equals(Ctrl.Text) Then
                        CType(Ctrl, TextBox).Text = tekst
                        Exit Sub
                    End If
                    LoadTextBox(Ctrl, Text)
                Next
            End If
        Next
    End Sub
0

Oczywiście że źle ponieważ po wywołaniu rekurencyjnym funkcji LoadTextBox wykona się nie tylko szukanie TextBoxa po kontrolkach na zakładce ale również pętla iterująca po zakładkach powinno to być coś w stylu:

     Private Sub SetTextBoxCtrlTextByCtrlName(ParentCtrl As Control, TextBoxName As String, CtrlText As String)
        If ParentCtrl.HasChildren Then
            For Each Ctrl As Control In ParentCtrl.Controls
                If (TypeOf Ctrl Is TextBox) And (Ctrl.Name.Equals(TextBoxName)) Then
                    Ctrl.Text = CtrlText
                    Exit Sub
                End If
            Next
        End If
    End Sub
    Private Sub ButtonLoad_Click(sender As Object, e As EventArgs) Handles ButtonLoad.Click
        Const FILE_PATH As String = "d:\testujemy\tresc\"

        If System.IO.Directory.Exists(FILE_PATH) Then
            For PageIndex As Integer = 0 To TabControl1.TabCount - 1
                Try
                    Dim r As New IO.StreamReader(FILE_PATH + "tresc" + CStr(PageIndex) + ".txt")
                    SetTextBoxCtrlTextByCtrlName(TabControl1.TabPages(PageIndex), "TextBox1", r.ReadToEnd)
                    r.Close()
                Catch
                End Try
            Next
        End If
    End Sub
0

kod ktory podales nie dziala ;/
a ja juz nawet nie mam pomyslu jak to zrobic :(
@kAzek

2

Ech bo się zagapiłem i w kodzie zapomniałem rekurencyjnie wywołać procedury (mimo że pisząc post pamiętałem że tak powinno być):

    Private Sub SetTextBoxCtrlTextByCtrlName(ParentCtrl As Control, TextBoxName As String, CtrlText As String)
        If ParentCtrl.HasChildren Then
            For Each Ctrl As Control In ParentCtrl.Controls
                If (TypeOf Ctrl Is TextBox) And (Ctrl.Name.Equals(TextBoxName)) Then
                    Ctrl.Text = CtrlText
                    Exit Sub
                End If
                SetTextBoxCtrlTextByCtrlName(Ctrl, TextBoxName, CtrlText) 'tego zapomnialem
            Next
        End If
    End Sub

1 użytkowników online, w tym zalogowanych: 0, gości: 1