Variable als Teil des Objektnamens hinzufügen

  • VB.NET

Es gibt 26 Antworten in diesem Thema. Der letzte Beitrag () ist von daniel1311.

    Variable als Teil des Objektnamens hinzufügen

    Hi!

    Ich programmiere ein Tool mit rund 200 kleinen Buttons. Diese Buttons sind durchnummeriert benannt (Button1, Button2,...).
    Die Buttons erhalten verschiedene Beschriftungen, je nach Programmverlauf.
    Da ich die Beschriftungen nicht jedes Mal einzeln machen möchte, suche ich nach einer Möglichkeit, dies zu automatisieren.

    Vorgestellt habe ich mir da sowas wie:

    dim i as integer
    for i = 1 to 10
    Form1.Button(1).Text = X
    next i

    Soweit die Theorie... Praktisch funktioniert das nicht.
    Habe das halbe Web durchsucht, aber keine funktionierende Lösung gefunden.

    Hoffe, mir kann jemand helfen.

    Gruß ds_mase
    Wie soll das funktionieren?

    Ich hab variable Werte, die in die einzelnen Button geschrieben werden.
    Das Problem sind ja die Objektnamen (Form1.Button1.Text = "TEXT").
    Ich möchte die "1" bei Button über eine Variable steuern, um in einer Schleifen alle Button-Texte ändern zu können.

    Oder funktioniert das auch mit nem Array?

    grz
    Dann gibt es das Control nicht oder me ist nicht Form1.

    Name Der Form(wenn auf sich selbst verwiesen wird : me).Controls(Index oder Name des Controls).Eigenschaft die du ändern willst = Neuer Eigenschaftswert.

    Teste es doch mal mit einer Form1, und einem hinzugefügten Button namens Button1.
    im klick event des Buttons schreibst du
    me.controls("Button1").text = "Neuer Text"

    Wenn du das verstanden hast, kannst du dir das ohne weiteres für viele Controls in einer Schleife schreiben.

    Man kann auch alle Controls durchlaufen:

    VB.NET-Quellcode

    1. For each Con as Control in me.controls
    2. If TypeOf(Con) Is Button THen
    3. DirectCast(Con,Button).Text = "Neuer Text"
    4. End if
    5. NExt

    wie du es jetzt für dich passend anwendest musst du selber wissen
    Das ist meine Signatur und sie wird wunderbar sein!
    Moin!
    War gestern mit meiner Meldung "jetzt klappts" n bissl zu früh.
    also... wenn ich in einem komplett leeren Projekt mit einer Form und einem Button folgenden Code eingebe:


    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    Dim a As Integer
    For a = 0 To 100
    Form1.Controls("Button" & a.ToString).Text = "Button " & a.ToString
    Next
    End Sub


    Bekomme ich den Fehler "NullReferenceException - Der Objektverweis wurde nicht auf eine Objektinstanz festgelegt."
    Das verstehe ich nun so, dass "Me" nicht bekannt ist o.ä.
    Wenn ich jetzt "Me" in "Form1" ändere, bekomme ich wiederum die Aufforderung, "Me" zu verwenden:
    ("WindowsApplication1.Form1" kann nicht durch die Standardinstanz auf sich selbst verweisen. Verwenden Sie stattdessen "Me".)

    Hoffe mir kann jemand helfen...
    Wenn du EINEN BUTTON hast
    Wie bitte schön, soll er den Text von Button2 bis 100 setzen ?
    Du sprichst so lediglich die Controls an..
    Wenn du in einer Form kein einziges Control hast, und schreibst dann Button1.Text = "Ich hab keen Plan"...
    Was denkst du wird passieren..
    Das ist meine Signatur und sie wird wunderbar sein!
    Ich sprech doch mit diesem Code nacheinander die Buttons Button1, Button2, Button3 ... Button100 an und ändere den Text jeweils in Button 1, Button 2, ...
    Dim a As Integer
    For a = 1 To 100
    Form1.Controls("Button" & a.ToString).Text = "Button " & a.ToString
    Next


    Oder net?

    daniel1311 schrieb:

    Ich sprech doch mit diesem Code nacheinander die Buttons Button1, Button2, Button3 ... Button100 an

    Du schreibst aber weiter oben, dass du nur EINEN Button auf der Form hast!

    Oder meinst du, dass du EINE form hast, die 100 Buttons hat und eine ZWEITE die nur einen Button hat und du möchtest jetzt von der zweiten Form aus, die Beschriftung der Buttons auf der ersten Form ändern?
    Hab mich falsch ausgedrückt, sorry.
    Das mit dem einen Button war nur, um diesen Code zu testen.
    Also nochmal:

    Viele Buttons bekommen je nach dem einen anderen Text. Jetzt möchte ich natürlich nicht jeden Button einzeln ansprechen:

    Button1.Text = a
    Button2.Text = b

    Vielmehr muss es doch möglich sein, die Buttons gezielt durchlaufen zu lassen:

    Dim i As Integer
    For i = 1 To 10
    Button(i).Text = a
    Button(i).Text = b
    Next i

    Habe Lösungen gefunden, alle Buttons auf dem gesamten Formular anzusprechen. Das bringt mir aber nichts, ich muss gezielt den ButtonX mit TextY versehen können.

    daniel1311 schrieb:

    ich muss gezielt den ButtonX mit TextY versehen können.

    Das macht man dann so wie oben von Mono beschrieben.

    Ich denke mal, du hast eher Probleme mit den Begriffen "Me" und "Form1" ...

    Me = Verweis auf die Klasse in der der gerade ausgeführte Code liegt. In anderen Sprachen heißt das dann auch mal "this" ... ;)
    Form1 = Name der Klasse, die die Form beschreibt UND ("Dreck", mit dem wir wegen der Kompatibilität zu vb6 leben müssen) der Name der STANDARDINSTANZ, die automatisch erzeugt wird, wenn man diesen Namen verwendet.

    Jedenfalls ist
    Instanzname.Controls("Controlname")
    der richtige Weg um ein bestimmtes Control anzusprechen, wenn man das dynamisch machen will. Allerdings sollte man das im Zweifel immer auf den richtigen Typ casten (Textbox, Button, etc), um Unklarheiten zu vermeiden.
    nur als anmerkung: so wird das nix

    daniel1311 schrieb:

    Dim i As Integer
    For i = 1 To 10
    Button(i).Text = a
    Button(i).Text = b
    Next i
    hier hast du zwar eine schleife, die die buttons durchläuft, ABER du überschreibst jeden button. sprich: du setzt Button(1).Text = a und direkt danach noch im selben durchlauf setzt du Button(1).Text = b.

    letzten endes wirst du deine 10 buttons alle mit dem text b haben. also wenn du nicht nur das i als variable in dem text haben willst, musst du die schleife hierfür auslassen.
    Also, hab jetzt folgenden Code in meinem Modul:


    For Each Con As Control In FormMain.TabPage1.Controls
    If TypeOf (Con) Is Button Then
    DirectCast(Con, Button).Text = "Neuer Text"
    End If
    Next

    Jetzt hab ich auf FormMain.TabPage1 die Buttons Button1, Button2...
    Ich möchte diese Buttons jetzt beschriften, aber immer nur gezielte Bereiche davon. Also z.B. Button4 bis Button7 erhält die Beschriftung 01,02,03,04.
    Wie das mit der Logik an sich funktioniert weiß ich, aber ich bin mir noch nicht ganz sicher, wie ich oben genannten Code auf mich anpasse.
    Wenn ich diesen Code ausführe, passiert nichts.

    Gruß
    Nun, ich hab das so verstanden:


    "Me" spricht das aktuelle Fenster an, wenn ich es direkt im Code verwende.
    Also z.B. in Public Class FormMain, Private Sub FormMain_Load wäre "Me" dann FormMain.
    Extern, also z.B. in einem Module nehme ich nicht "Me" sondern "FormMain".

    Nein, mit "Breakpoints" habe ich mich noch nicht befasst, sagt mir nichts.

    Bin absoluter Neuling, hab diese Woche erst angefangen, zu lernen.

    ?(
    das zu den forms stimmt so schonmal. was die breakpoints angeht, du hast links vom quellcode eine graue leiste. wenn du da reinklickst erscheint ein roter punkt, das ist der breakpoint.

    wenn du das programm jetzt laufen lässt, wird es genau an diesem punkt stoppen und du kannst unten im "Lokal"-fenster alle aktuell verwalteten variablen sehen und über den button "Einzelschritt" (direkt rechts neben dem "Stop"-button) oder via "F11" den code schritt für schritt durchgehen.

    das is sehr nützlich für fehlersuche :thumbsup:
    Okay, erstmal danke für die Tipps!
    Hab mich jetzt mal in Breakpoints eingelesen und auch gleich mal ein wenig "gespielt".
    "Debug.Print" kannte ich, im Kombination mit Breakpoints ist das eine feine Sache...


    @lordknoblauch: Dann bin ich ja beruhigt, wenn ich damit recht hatte. Dachte schon, ich hab das komplett missverstanden ;)

    Trotz allem hab ich noch keine Lösung für mein Problem. Bin hier die ganze Zeit an rumprobieren, googlen, posten... Aber eine passende Funktion hab ich leider noch nicht.
    Hat jemand ne Idee, wie ich meinem Ziel näher komme?