Controls dynamisch ansprechen

  • VB.NET

Es gibt 16 Antworten in diesem Thema. Der letzte Beitrag () ist von nogood.

    Controls dynamisch ansprechen

    Moin,

    10 Progressbars sollen in einer For ... next Schleife mit Werten gefüllt werden.
    Frage wie kann ich bei der Progressbar1.value = 50 die 1 durch das i ersetzen?

    VB.NET-Quellcode

    1. For i = 1 To 10
    2. ("ProgressBar" & i).value= WerteArray(i-1)
    3. Next


    So einfach geht es dann doch nicht oder
    codewars.com Rank: 4 kyu
    1. Was is'n das für ein besch...werlicher Threadtitel? Bitte umgehend an was inhaltlich sinnvolles anpassen.
    2. "Ich finde es gerade im Internet nicht." Recherchen können auch manchmal länger dauern und ggf. nur durch Anpassen der Suchbegriffe zum Erfolg führen.
    3. Arbeitest Du mit Option Strict On?
    4. DirectCast(Me.Controls("ProgressBar" & i.ToString), ProgressBar).Value = wäre eine Möglichkeit. Oder Du fasst alle ProgressBars zu einem Array zusammen und gehst die durch:

    VB.NET-Quellcode

    1. Dim ProgressBarArray = {ProgressBar1, ProgressBar2, ProgressBar3, ProgressBar4, ProgressBar5, ProgressBar6, ProgressBar7, ProgressBar8, ProgressBar9, ProgressBar10}
    2. For i = 0 To ProgressBarArray.Count - 1
    3. ProgressBarArray(i).Value = WerteArray(i - 1)
    4. Next

    5. Deine ProgressBars haben bessere Namen verdient.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Danke für die nächtliche Antwort :)
    1. Ja ich weiß bescheuerter Titel -> Mein Gedanke war ich frag die nächste Banale Sache dann wieder hier -> es ist schon spät war wohl einfach nur ...
    2. siehe Titel
    3. nein
    4. bringt bei mir eine Fehlermeldung (System.NullReferenceException: "Der Objektverweis wurde nicht auf eine Objektinstanz festgelegt.")

    schade das wäre ne schöne Lösung (habe vorher dies versucht (InternetRecherche) ging auch nicht :

    VB.NET-Quellcode

    1. Me.Controls("ProgressBar" & i.ToString).Value=50

    ------------
    Die Idee mit dem Array hat geklappt. DANKE <3
    Falls jemand eine Idee hat warum das mit Me.Controls nicht klappt würde mich schon interessieren was ich da wieder für ein Bock drin habe... ich sag mal gute Nacht

    codewars.com Rank: 4 kyu

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „nogood“ ()

    Na, wie heißen denn Deine ProgressBars? Denn bei mir läuft es, wenn die Dinger so heißen, also
    ProgressBar1, ProgressBar2, ProgressBar3, ProgressBar4, ProgressBar5, ProgressBar6, ProgressBar7, ProgressBar8, ProgressBar9, ProgressBar10

    Im Designer anklicken -> Eigenschaftenfenster -> (Name). Exakte Angaben werden gebraucht!

    btw: Dass Du ohne Option Strict On arbeitest, wird Dir hier im Forum oft mit Argwohn übelgenommen. Denn ohne das entstehen nicht wenige Fehler, die sich einfach vermeiden lassen -> Option Strict On! siehe empfohlene VS-Einstellungen
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.

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

    Die ProgressBars heißen genau so wie Du schreibst: ProgressBar1, ProgressBar2,...

    Deine Idee Mit dem Array funktioniert ja auch DANKE dafür (dafür müssen die Namen ja auch stimmen).

    Warum das mit Me.Controls nicht geht weiß ich nicht
    codewars.com Rank: 4 kyu
    Wenn der Fehler kommt, hält ja das Programm an. Fahr mal mit dem Mauszeiger dann über das i und sag mal an, welchen Wert es zu diesem Zeitpunkt hat.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Ja das ist die Lösung i=0 und ProgessBar0 gibt es nicht -> Fehlermeldung ... Super! Danke für Deine Hilfe

    VB.NET-Quellcode

    1. For i = 1 To 10
    2. DirectCast(Me.Controls("ProgressBar" & i.ToString), ProgressBar).Value = 50
    3. Next


    Code setzt alle Bars auf den Wert 50
    codewars.com Rank: 4 kyu

    nogood schrieb:

    Ja das ist die Lösung
    Nö.
    Das ist Grütze.
    Wenn Du Controls mit ihrem Namen ansprichst, kannst Du sie nicht mehr umbenennen.
    Und:
    Wozu müssen 10 Progressbars synchron laufen?
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Man kann auch, als Alternative zu der Array Lösung von @VaporiZed, einfach alle Controls der Form per Schleife durchlaufen und mit Werten befüllen. Deine Lösung @nogood finde ich nicht gut da „Dirty Workaround“ ...
    "Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. Lehre einen Mann zu fischen und du ernährst ihn für sein Leben."

    Wie debugge ich richtig? => Debuggen, Fehler finden und beseitigen
    Wie man VisualStudio nutzt? => VisualStudio richtig nutzen

    mrMo schrieb:

    einfach alle Controls der Form per Schleife durchlaufen und mit Werten befüllen
    Und falls da noch 3 Buttons, 2 Labels und 4 ProgressBars sind, die unangetastet bleiben sollen?
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.

    VaporiZed schrieb:

    mrMo schrieb:

    einfach alle Controls der Form per Schleife durchlaufen und mit Werten befüllen
    Und falls da noch 3 Buttons, 2 Labels und 4 ProgressBars sind, die unangetastet bleiben sollen?


    Er müsste den Typ des Controls abfragen das er am Wickel hat und seinen Code nur ausführen, wenn es sich um eine Progressbar handelt.
    Gruß Murdoc

    VaporiZed schrieb:

    Und falls da noch [...] 4 ProgressBars sind, die unangetastet bleiben sollen?

    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    @VaporiZed wenn er nicht alle Progressbars ansprechen will, wäre die Array Lösung von dir die richtige.
    "Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. Lehre einen Mann zu fischen und du ernährst ihn für sein Leben."

    Wie debugge ich richtig? => Debuggen, Fehler finden und beseitigen
    Wie man VisualStudio nutzt? => VisualStudio richtig nutzen

    RodFromGermany schrieb:

    nogood schrieb:

    Ja das ist die Lösung
    ...
    Wenn Du Controls mit ihrem Namen ansprichst, kannst Du sie nicht mehr umbenennen.
    Und:
    Wozu müssen 10 Progressbars synchron laufen?

    1. Danke für die ganzen Infos
    2.Bin ja noch blutiger VB Anfänger. Könnte Jemand einen Link Posten wo das mit Me.Controls ()... nochmal simple erklärt wird. Oder kurz sagen warum dies nicht die beste Lösung ist. Warum kann man den Namen denn nicht immer wieder so ändern?
    3. So wie ich das jetzt raus lese wäre es mit dem Array am besten gelöst ? Richtig?
    4. Wozu 10 Progressbars -> für eine Kundenmeinungsumfrageauswertung sollen die Werte so wie in Excel in einem Säulen Diagramm angezeigt werden.

    ------------------
    Ach so: noch was ich vermute mal, dass man das ganze am besten als Klasse / Objekten lösen sollte. Das ist aber für mich noch zu "viel" (bin Oldschool mit .txt Dateien unterweg). Gibt es Online eine gute Seite mit Übungen Erklärungen zur Benutzung von Klassen etc. (also schon etwas spezifischer als das immer wieder auftauchende Autofabrik Bsp. ) am Beispiel einer Kartei/ Lager oder so
    codewars.com Rank: 4 kyu

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „nogood“ ()

    nogood schrieb:

    warum dies nicht die beste Lösung ist. Warum kann man den Namen denn nicht immer wieder so ändern?
    Klar kann man umbenennen wie man will. Nur stell Dir mal vor Du hättest diesen Code:
    Me.Controls("ProgressBar1").Value = 50. Und dann stellst Du fest - z.B. weil Dein Programm sehr groß geworden ist - dass der Name ProgressBar1 nicht sonderlich aussagekräftig ist und Du willst es umbenennen in PBarCurrentVolume (Post#2, letzter Satz). Was machst Du (sinnvollerweise)? Du gehst z.B. in den Form-Designer, wählst die ProgressBar1 an und benennst es dort einmalig um. Dadurch werden alle Stellen im Code automatisch geändert, die auf ProgressBar1 verweisen. Stand also irgendwo ProgressBar1.Value = 0, dann steht da jetzt PBarCurrentVolume.Value = 0. ABER! Die Stelle, wo Du Me.Controls("ProgressBar1").Value = 50 stehen hast, wird nicht geändert, weil VS zur Deignzeit nicht ermittelt, ob der String/Text da irgendwas mit Deinem ProgressBar zu tun hat. Und schon funktioniert Dein Programm nicht mehr, weil zur Laufzeit an dieser Codestelle ProgressBar1 nicht mehr als Objekt erkannt wird. Aber irgendwie würde es mich nicht wundern, wenn Du die Umbenennung per Suchen&Ersetzen machst - was Du niemals tun solltest. Denn Du könntest was übersehen oder ProgressBar11 versehentlich mit umbenennen. Und außerdem ist das voll die mühselige Arbeit. Nutze Deine IDE bei den Sachen, bei denen sie die helfen kann. Und deshalb: Grätsch ihr nicht mit Strings wie Me.Controls("ProgressBar1") hinein.

    nogood schrieb:

    für eine Kundenmeinungsumfrageauswertung sollen die Werte so wie in Excel in einem Säulen Diagramm angezeigt werden
    Ich hab mich schon gefragt, was das werden konnte. Nach 14 Posts wird Dir aber hoffentlich bald bewusst, dass solche Infos von Dir kommen sollten. Und zwar zum Anfang. Denn es gibt ein Chart-Objekt, was extra für die Erstellung von Diagrammen entwickelt wurde. Du brauchst also keine ProgressBars für sowas zu missbrauchen.

    @VB1963: Die folgende Info ist keine Extra-Antwort wert, daher als edit: Der Originaltitel war ja so ungefähr: "Ich bräuchte etwas Hilfe bei einem kleinen Problem, Ich finde es gerade im Internet nicht." Daher mein Kommentar in Post#2.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.

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

    Dieser Thread beweist sehr schön: wenn man Controls dynamisch über deren Namen ansprechen will, dass sich das gesamte Projekt bereits zu einen gewaltigen Designfehler entwickelt hat.
    In diesem Fall wäre ein Chart-Control die bessere Weise gewesen...

    Man kann aber auch direkt zum Control heran:

    VB.NET-Quellcode

    1. For Each bar In Me.Controls
    2. If bar Is ProgressBar1 Then ProgressBar1.Value = WerteArray(i-1) 'usw...
    3. Next
    abgesehen von der besch. Benamung...

    Dieser Beitrag wurde bereits 6 mal editiert, zuletzt von „VB1963“ ()

    @ VaporiZed :Toll erklärt .Danke. Ist mir selber nicht eingefallen. Aber den Moment wo Du sagt die Progressbar im Editor umzubenennen viel der Groschen.
    Die LSG mit der einen Zeile sah so schön aus...

    @VB1963
    gerne nehme ich deinen Input auf und versuche wenn ich das ganze "Erstmal" fertig habe noch mal besser zu lösen.

    Daher ja auch die Frage nach Link zu Klassen/Objekten. Wahrscheinlich sollte ich auch Dataset benutzen um die Daten besser zu organisieren und nicht stumpf .txt Dateien verwenden. Leider bin ich noch nicht so tief in der Materie drin, dass ich das mal eben so schaffe. Genau so mit Chart-Control ist wieder etwas mehr wissen nötig, Progressabrs zu missbrauchen war da einfacher. Ich kann dich aber beruhigen den Code bekommt keiner zu sehen ...
    codewars.com Rank: 4 kyu