Controls über Schleife und über Variable ansprechen

  • VB.NET

Es gibt 28 Antworten in diesem Thema. Der letzte Beitrag () ist von Brave.

    Controls über Schleife und über Variable ansprechen

    Hallo liebe Forumsspezialisten!

    1)

    Ich habe auf meinem Formular an die 100 Textboxen und möchte diese in Abhängigkeit von ihren Werten mit einer Hintergrundfarbe einfärben. Dies möchte ich schon beim Laden des Formulars initiieren. Alle Textboxnamen beginnen mit txtTV. Es folgt dann eine Durchnummerierung von 1 bis 100.
    Wenn der Wert einer Textbox > 0 ist, dann soll die Hintergrundfarbe Grün sein, ansonsten keine Hintergrundfarbe.

    2)

    An einer anderen Stelle im Code möchte ich die Textboxen einzeln über eine Variable ansprechen.

    Z.B.:

    txtTV1.Text = 5

    soll in etwa so angesprochen werden können:

    "txtTV" & Variable &" .Text" = 5



    Geht so was?
    hallo Klavier,
    deine Textboxen heißen also alle "txtTV1, txtTV2, txtTV3 usw... , oder?

    dann gehst du wie folgt vor

    1. Aufzählen aller Controls und im globalen Bereich eine List of Textbox erstellen
    unter Public CLass Form1

    VB.NET-Quellcode

    1. Dim lstTbox as (listOf Textbox)


    VB.NET-Quellcode

    1. for each ctrl as COntrol in me.controls
    2. if typeof Control Is Textbox then
    3. lstTbox.add(ctrl)
    4. end if
    5. next 'ctrl


    jetzt kannst du alle Textboxen einfach mit der Liste ansprechen

    hoffe ich konnte helfen
    grüße
    Danny233223

    Me.Controls... bringt Fehler

    Hallo,

    auch wenn das Thema ja eigentlich schon geschlossen ist.

    Ich habe ein ähnliches Problem:

    VB.NET-Quellcode

    1. Public Function zb_IST(ByVal SGHex As String)
    2. Return Me.Controls("IST_" & SGHex).Text
    3. End Function

    Führt zur Fehlermeldung:
    NULLREFERENCEEXCEPTION wurde nicht behandelt
    Der Objektverweis wurde nicht auf eine Objektinstanz festgelegt.
    Der Inhalt der Textbox ist nicht NULL.

    Gibt es dazu eine Lösung?

    Danke
    Lothar
    Die von dir angesprochene Textbox existiert (an der Stelle) nicht.

    Ich würde auch immer DirectCast benutzen, wenn man Controls über die collection anspricht:

    VB.NET-Quellcode

    1. Return DirectCast(Me.Controls("IST_" & SGHex),Textbox).Text


    Häufigste Fehlerquellen bei diesem Problem:

    1. Textbox liegt auf einem Panel oder auf sonst irgendeinem Control, und gehört daher nicht zu me.controls.
    2. Der Name der Textbox ist schlicht falsch
    Das ist meine Signatur und sie wird wunderbar sein!
    Hey Leute.

    ich nutz am besten dieses Thema, da ich eigentlich das selbe Problem habe.

    Ich will 40 Textboxen die auf einer Form2 liegen entweder über Form2 oder über Form1 ansprechen und in Abhängigkeit eines Indexes einzelnd ansprechen.

    das sieht so aus:

    Me.Controls("TextBox" & Str(i)).Text = Preise(i)
    oder
    Name_der_Klasse_oder_der_Form.Controls("TextBox" & Str(i)).Text = Preise(i)

    nun kommt immer die Fehlermeldung:

    Der Objektverweis wurde nicht auf eine Objektinstanz festgelegt.

    Ich vermute dass es an Folgendem Satz liegt, den ich nicht verstehe und lieder nicht umsetzen kann.

    1. Aufzählen aller Controls und im globalen Bereich eine List of Textbox erstellen
    unter Public CLass Form1

    Bin noch relativ neu in dem Gebiet und wäre nett, wenn man Leichtverständliche Beispiele als Erklärung evtl mit Anhängen könnte.

    VB.NET-Quellcode

    1. Public Class Produkte
    2. Private Sub Produkte_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
    3. Dim i As Integer
    4. Dim Preise(0 To 40) As String
    5. Dim n As Integer
    6. For n = 1 To 40
    7. Preise(n) = Internet.Preis(n) ' Preise von Form "internet" der Form Produkte übergeben.
    8. Next
    9. For i = 1 To 40
    10. Me.Controls("TextBox" & Str(i)).Text = Preise(i) ' Hier sollen die Textboxen mit den Preisen befüllt werden
    11. Next i
    12. End Sub
    13. End Class



    Ich danke

    Gruß BlackWest

    VB.NET-Quellcode

    1. Private Sub Produkte_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
    2. Dim i As Integer
    3. Dim Preise(0 To 40) As String
    4. Dim n As Integer
    5. For i = 1 To 40
    6. DirectCast(Me.Controls("TextBox" & i), TextBox).Text = i ' Das " = i " ist absicht ums so einfach wie möglich zu halten zum testen.
    7. Next i
    8. end sub
    9. end class


    Klappt leider immer noch nicht.
    Fehlermeldung:

    Der Objektverweis wurde nicht auf eine Objektinstanz festgelegt.

    was muss ich vorher noch machen? Deklarieren? Erstellen?

    Danny233223 schrieb:

    for each ctrl as COntrol in me.controls
    if typeof Control Is Textbox then
    lstTbox.add(ctrl)
    end if
    next 'ctrl


    Versuch die Variante. Stell auch sicher das die TextBoxen auf der Form sind.
    Sollten die TextBoxen in einem Panel oder ändliches liegen musst du natürlich anpassen.

    VB.NET-Quellcode

    1. For each Ctrl As Control in Me.Panel
    Existieren denn die 40 Textboxen ?
    Und wann tritt der Fehler auf ?
    Geh deine Schleife in Einzelschritten durch.
    Tritt der Fehler bereits bei i=1 auf ?
    Wenn ja:

    Gibt es auf dieser Form eine Textbox die EXAKT den NAMEN TextBox1 hat?
    Das ist meine Signatur und sie wird wunderbar sein!

    ChaosBernd schrieb:

    Versuch die Variante. Stell auch sicher das die TextBoxen auf der Form sind.
    Sollten die TextBoxen in einem Panel oder ändliches liegen musst du natürlich anpassen.

    Der Post hats gelöst :)
    Es lag daran, dass ich die Textboxen in einer Groupbox hatte.


    ich hab die Groupbox entfernt und es Funktioniert mit

    VB.NET-Quellcode

    1. For i = 1 To 30
    2. DirectCast(Me.Controls("TextBox" & i), TextBox).Text = i
    3. Next i


    Ich danke euch :)



    Gruß Black!
    hallo zusammen,

    auch wenn das hier alles schon ne weile her ist ....

    aber hier sind meine erfahrungen ...


    BlackWest schrieb:

    For i = 1 To 30
    DirectCast(Me.Controls("TextBox" & i), TextBox).Text = i
    Next i

    geht bei mir garnicht :(

    Quellcode

    1. Me.TabControl1.TabPages(1).Controls("NameDesControls").text


    ebenso wenig wie

    Quellcode

    1. DirectCast(Me.TabControl1.TabPages(1)Controls("NameDesControls"),Button).Text


    was aber geht ist über den Index ...

    Quellcode

    1. Me.TabControl1.TabPages(1).Controls(2).Text

    ich würde das ganze aber gerne über den Namen des Controls lösen,wie weiter ober beschrieben.
    Ich habe keine Ahnung was ich hier falsch mache :( aber ich hoffe auf eure geniale hilfe.
    g Brave
    hi xtts02,

    ja ich bin sicher .... sollte nur ein Beispiel sein .... ich habe auf einem Form ein TabControl1 mit 7 Tabs die wiederum 13 verschieden Controls beeinhalten die wiederum unterschiedlicher typen sind.

    Ich bekomme leider keine Fehlermeldung :( ich progammiere eine SmartDevice Anwendung (ich versuche zumindest) und die Laufzeit wird an dieser stelle ohne irgend einen Hinweis abgebrochen. Das liegt aber bestimmt an mir weil ich noch nicht so lange Programmiere und noch nicht so viel erfahrung habe :( .

    g Brave
    Lass sicherheitshalber nochmal die Liste der Controls ausgeben und vergleichen, ob richtiger Control-Name bzw. Index angesprochen wurde.

    VB.NET-Quellcode

    1. For Each tp As TabPage In TabControl1.TabPages
    2. For Each ctrl As Control In tp.Controls
    3. Debug.WriteLine("TabPageName: " & tp.Name & " - ControlName: " & ctrl.Name & " - ControlText: " & ctrl.Text)
    4. Next
    5. Next