Textfelder dynamisch ansprechen

  • VB.NET

Es gibt 22 Antworten in diesem Thema. Der letzte Beitrag () ist von BuddyHaus.

    Textfelder dynamisch ansprechen

    Hallo,

    nach langer Abstinenz bin ich wieder in VB zu Hause und nutze jetzt VB2010 Ultimate.

    Ich hätte eine Frage und zwar habe ich die letzten Jahre immer wieder mit Access programmiert und habe dort ein Formular mit unzähligen Textfeldern. Um diese Felder zu leeren, hatte ich eine For-Schleife.

    Quellcode

    1. For i = 1 To 15
    2. FormXY("FeldABC_" & i) = ""
    3. Next i


    Das Ergebnis sieht dann so aus : FormXY.FeldABC_1

    Nun die Frage wie sieht das ganze auf VB-Basis auf?

    Schöne Grüße
    Axel
    @Unwesen aua ;(

    @axeos warum brauchst Du das unbedingt ?

    Alle Controls auf einer Form werden in der Form.Controls Collection referenziert. Wenn das Control einen Namen hat, z.B. Textbox1, so kann man es dort auch mit seinem Namen abrufen:

    VB.NET-Quellcode

    1. dim c as Control = Form1.Controls("Textbox1")

    Will man nur die Text-Eigenschaft aller Textboxen einer Form zurücksetzen, so geht das auch so:

    VB.NET-Quellcode

    1. for each c as control in Me.Controls
    2. if typeOf(c) is Textbox then c.Text=""
    3. Next

    Danke & Sorry

    Hi & Danke,

    @Unwesen{PN}: Ich glaube wir reden gerade an zwei Dingen vorbei und ich muss ehrlich sagen, dass übersteigt momentan noch mein Horizont.

    Mir hatte mal einer gesagt, dass man VBA und VB vergleichen könnte, aber momentan scheint mir das Kontinentweit entfernt voneinander sein.

    Ich will einen neuen Datensatz aufrufen oder einen neuen erstellen und muss/will davor die Felder alle leeren, wenn ein Datensatz bereits geladen ist. Der Form ist Ungebunden.

    Jetzt habe ich ein Formular mit ca. 160 Feldern und einige heißen davon bspw. txt_Nummer_1 ... bis ... txt_Nummer_15. Um jetzt nicht jedes Feld einzeln im Code nennen und leeren zu müssen, will ich dieses über die For-Schleife machen.

    Unter Access war das echt easy mit dem Statement oben und das gleiche will ich auch jetzt in VB haben. Mal ganz abgesehen davon habe ich nicht nur Textboxen, sondern auch Comboboxen.

    Gibt es da nicht eine einfachere Variante vglb. mit der "Accischen"-Variante???

    Grüße Axel

    axeos schrieb:

    Jetzt habe ich ein Formular mit ca. 160 Feldern und einige heißen davon bspw. txt_Nummer_1 ... bis ... txt_Nummer_15. Um jetzt nicht jedes Feld einzeln im Code nennen und leeren zu müssen, will ich dieses über die For-Schleife machen.

    Die Lösung wurde doch mehr oder minder genannt:

    VB.NET-Quellcode

    1. for i as integer=1 to 15
    2. Me.Controls("txt_Nummer_" & i.tostring ).Text = ""
    3. next i

    Sorry leider klappt es nicht

    Hi,

    leider klappt das aber das nicht.

    VB.NET-Quellcode

    1. Public Function func_KalkLeeren()
    2. Dim i As Integer
    3. For i = 1 To 10
    4. frm_kalkulation.Controls("txt_Bezeichnung_" & i).Text = ""
    5. frm_kalkulation.Controls("txt_Menge_" & i).Text = ""
    6. frm_kalkulation.Controls("txt_EPreis_" & i).Text = ""
    7. frm_kalkulation.Controls("txt_GPreis_" & i).Text = ""
    8. Next
    9. End Function


    Gleiches Ergebnis übrigens mit i.tostring Das ist jetzt mein Modul und ich weiß nicht mehr weiter.

    Gruß Axel

    axeos schrieb:

    Das ist jetzt mein Modul und ich weiß nicht mehr weiter.

    Die Textboxen müssen dabei direkt auf der Form und nicht in einem anderen Container-Element ( Panel, GroupBox, etc.) liegen. Diese haben ihre eigene Controls Collection ...

    Oder sprechen wir hier zufällig von Access-Formularen und nicht von Windows.Forms ?

    Anscheinend sollte ich bei meinen Leisten bleiben

    Hallo,

    ich rede ganz bestimmt von Windows.Forms, bzw. der Code steckt in einem Modul. Ich wollte eben ausprobieren ob ich das in Access geschriebene Kalkulationsprogramm verbessert auf VB programmieren könnte.

    Ok, dann hatte ich doch ein Verständnisproblem. Die Felder befinden sich alle auf einer Tab-Seite genannt "page_eins" auf dem TabControl "tab_Kalkulation" auf dem Formular "frm_Kalkulation".

    Ich habe jetzt folgenden Befehl

    VB.NET-Quellcode

    1. frm_kalkulation.page_eins.Controls("txt_Bezeichnung_" & i.ToString).Text = ""


    Trotzdem läuft das alles irgend wie nicht. Sollte ich bei meinen Leisten und Access bleiben, wenn ich schon bei der ersten Programmierarbeit scheitere?

    Grüße
    Axel

    axeos schrieb:

    Trotzdem läuft das alles irgend wie nicht.

    Könntest Du noch etwas unpräziser sein ? :rolleyes:

    Führe mal folgenden Code aus:

    VB.NET-Quellcode

    1. For Each c As Control In frm_kalkulation.page_eins.Controls
    2. MessageBox.Show(c.Name)
    3. Next

    Das sollte Dir alle Namen Deiner Controls auf Deiner TabPage ausgeben. Falls Du weiter Probleme hast lad das Projekt einfach mal hoch, sonst raten wir hier noch bis zum Sankt-Nimmerleinstag herum ...

    Fehler oder Unlogik gefunden

    Hallo,

    ich habe den Fehler oder die Unlogik oder wie man das auch nennen mag gefunden.

    Ich hatte mir nicht nur den Namen des Controls anzeigen lassen, sondern auch den Inhalt und obwohl ich in jedes Feld einen Wert stehen hatte, hat er mir keinen angezeigt.

    Nun habe ich die Funktion direkt in das Formular rein kopiert und schwupp die wupp läuft der Code.

    Daher meine Frage: Warum kann ich nicht / Wie kann ich lesend/schreibend auf ein Formular zu greifen über ein Modul.

    Schöne Grüße
    Axel

    axeos schrieb:

    Daher meine Frage: Warum kann ich nicht / Wie kann ich lesend/schreibend auf ein Formular zu greifen über ein Modul.

    Ganz normal über die Referenz zur Form:

    VB.NET-Quellcode

    1. Option Strict On
    2. Public Class Form1
    3. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    4. testModule.ShowControls()
    5. End Sub
    6. End Class
    7. ' module
    8. Module testModule
    9. Sub ShowControls()
    10. For Each c As Control In Form1.Controls
    11. Trace.WriteLine(c.Name & " , " & c.GetType.ToString)
    12. Next
    13. End Sub
    14. End Module

    Da wir Deinen Code nicht kennen, ist es auch schwer zu ahnen was Du falsch machst.

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Kangaroo“ ()

    Hallo,

    meine bisherige Anwendung ist nur grafisch erfolgt.
    Die vier Zeilen Code die ich da drin stehen habe, sind nur die Zeilen zum löschen der Feldinhalt der besagten Felder.

    Wenn ich mir jetzt Deinen Code angucke, dann muss ich sagen, dass VBA und VB überhaupt nichts mit einander zu tun haben und auch nicht wirklich verwandt sind, denn in Access brauche ich nur eine Zeile Code um ein Feldinhalt zu löschen, hier mehrere um überhaupt erst einmal auf das Feld zugreifen zu können. Sehr kompliziert.

    In meinem Formular (siehe Bild) habe ich in jeder Zeile ein X für Zeile löschen. Dafür steht jetzt nachfolgender Code

    VB.NET-Quellcode

    1. Private Sub pic_delete_1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles pic_delete_1.Click
    2. ' Jeweilige Zeile löschen
    3. Dim int_zeile As Integer
    4. int_zeile = 1
    5. ' Feldinhalt löschen
    6. Me.Controls("txt_Bezeichnung_" & int_zeile).Text = ""
    7. Me.Controls("txt_Menge_" & int_zeile).Text = ""
    8. Me.Controls("txt_EPreis_" & int_zeile).Text = ""
    9. Me.Controls("txt_GPreis_" & int_zeile).Text = ""
    10. ' Daten aus der Datenbank löschen
    11. ' { Code / Funktion folgt noch }
    12. ' call func_MatLoeschen(int_Zeile)
    13. End Sub


    Wenn ich dann diesen Code ausführen möchte, erhalte ich eine Fehlermeldung (siehe 2. Bild). Ich weiß nicht mehr weiter und die beiden Bücher von Kotz und Monadhemi können mir da auch nicht weiterhelfen.

    Grüße
    Axel
    Bilder
    • frm_kalkulation.png

      41,16 kB, 824×612, 348 mal angesehen
    • fehlermeldung.png

      16,74 kB, 455×239, 306 mal angesehen

    axeos schrieb:

    Wenn ich dann diesen Code ausführen möchte, erhalte ich eine Fehlermeldung (siehe 2. Bild). Ich weiß nicht mehr weiter und die beiden Bücher von Kotz und Monadhemi können mir da auch nicht weiterhelfen.

    Aller Anfang ist schwer :rolleyes:

    Wie aus Deinem geposteten Bild hervorgeht sieht es so aus als ob Deine Form folgende Controls hat:
    - 3 Textboxen ( Titel, Erstell-, Änderungsdatum)
    - 1 TabControl
    - 1 Menüleiste (?)

    Deine Label, Comboboxen, Textboxen etc. liegen innerhalb einer TabPage, die nun wieder ihre eigene Controls Collection hat. Insofern ist es kein Wunder wenn die in Deinem Code nicht angesprochen werden.

    Aller Anfang ist schwer

    Danke Jungs,

    aller Anfang ist wirklich schwierig, aber Stückchen für Stückchen finde ich den Weg.

    Der Hinweis mit dem Control hat mich dann weitergebracht, sodass jetzt auch mein Code funktioniert.

    Dann sei aber die Frage gestellt, warum nicht einfach der Fehlerhinweis kommt: Feld nicht gefunden! Dann wäre ich vielleicht auch noch auf die Idee gekommen mit den unterschiedlichen Controls. Typisch Microsoft mit der fehlender oder unzureichender Fehlerbeschreibung. "Ich hab da einen Fehler, wo wie wann weiß ich gerade selbst nicht. Selber suchen heißt die Devise! Grüße Microsoft"

    Vielen Dank für die Hilfen, ich werde jetzt mal versuchen alleine weiterzumachen.

    Danke&Grüße
    Axel