Namen von Controls aus Variablen zusammensetzen

  • VB.NET

Es gibt 18 Antworten in diesem Thema. Der letzte Beitrag () ist von Fakiz.

    Namen von Controls aus Variablen zusammensetzen

    Moin!

    ich habe zum Beispiel eine ganz einfache Code-Zeile:


    VB.NET-Quellcode

    1. If main_destination_2.Text.Length > 0 Or main_destination_2.Text.Length > 0 Or main_destination_1.Text.Length > 0 Then


    Diese soll es nun auch für die Namen main_destination_1, main_destination_3,... geben. Genauso könnte sich der vordere Teil es Namens ändern.

    Kann man irgendwie aus Variablen einen solchen Namen zusammenbauen? Wie?

    Gruß Jan
    1. nein, geht nicht (so einfach)
    2. If main_destination_2.Text.Length > 0 Or main_destination_2.Text.Length > 0 ist moppelt gedoppelt.
    3. mach Dir den Unterschied zwischen Or und OrElse klar (<= ist ein Hinweis, dass es OrElse gibt, genauso And <=> AndAlso)
    4. Du kannst zwar mittels einer Schleife durch alle Controls gehen und so z.B. die Namen der TextBoxen rausfischen und daraufhin was mit den entsprechenden CEs machen:

    VB.NET-Quellcode

    1. For Each ctl As Control In Me.Controls
    2. If TypeOf (ctl) Is TextBox Then MessageBox.Show(ctl.Name)
    3. Next

    aber Deine Herangehensweise lässt einen Designfehler vermuten und befürchten.

    Dein geposteter Code will ein Problem lösen. Welches genau? Versuch mal ne ausführliche Beschreibung. Ich bin mit ziemlich sicher, dass es einen besseren Weg gibt.
    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.
    Moin!

    ein einfaches Beispiel wäre folgendes:

    VB.NET-Quellcode

    1. Private Sub bt_copy_lanes_3to2_Click(sender As Object, e As EventArgs) Handles bt_copy_lanes_3to2.Click
    2. main_destinationintref_2.Text = main_destinationintref_3.Text
    3. main_destination_2.Text = main_destination_3.Text
    4. End Sub
    5. Private Sub bt_copy_lanes_2to1_Click(sender As Object, e As EventArgs) Handles bt_copy_lanes_2to1.Click
    6. main_destinationintref_1.Text = main_destinationintref_2.Text
    7. main_destination_1.Text = main_destination_2.Text
    8. End Sub


    Das könnte man nach meiner Vorstellung in diese Form bringen - Schreibfehler eingeschlossen!

    Mein fraglichen Stellen habe ich in eckige Klammern geschrieben um die Stellen zu kennzeichnen!

    VB.NET-Quellcode

    1. Private Sub bt_copy_lanes_from_to(idx_from as integer,idx_to as integer )
    2. main_destinationintref_[idx_to.tostring].Text = main_destinationintref_[idx_from.tostring].Text
    3. main_destination_[idx_to.tostring].Text = main_destination_[idx_from.tostring].Text
    4. End Sub

    [/vbnet]
    Wie gesagt: nein, das geht so eben nicht. Du müsstest eben eine Schleife über alle Textboxen laufen lassen, Dir den Namen geben lassen (=> String) und dann einen Vergleich mit einem Wunsch-String machen, also als PseudoCode:

    Quellcode

    1. Funktion HinUndHerWechselnVonBeschriftungen(mit Parameter QuellTextboxname, ZielTextboxname)
    2. Schleife über alle CEs:
    3. Wenn CE keine Textbox ist, geh zum nächsten CE
    4. Wenn CE-Name = QuellTextboxname, dann merk Dir Diese QuellTextBox
    5. Wenn CE-Name = ZielTextboxname, dann merk Dir Diese ZielTextBox
    6. Schleifenende
    7. Pack den Inhalt der QuellTextBox in die ZielTextBox
    8. Funktionsende

    1. Versuch diesen Pseudocode mal in VB-Code umzuwandeln, damit wir sehen, wie gut Deine VB-Kenntnisse sind und klar wird, wie intensiv wir ne Diskussion betreiben können
    2. Du hast das Grundproblem immer noch nicht genannt.
    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.

    jan99 schrieb:

    Kann man irgendwie aus Variablen einen solchen Namen zusammenbauen?
    Das könnte man sicherlich, man sollte es aber sein lassen, denn Controls können umbenannt werden, und dann greift Deine Logik nicht mehr.
    Pack die betreffenden Controls in ein Array und arbeite damit:

    VB.NET-Quellcode

    1. Dim ctrl() = {Button1, Button2, Button3}
    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!
    Moin !

    obwohl mir der Code von xtts02 mit am besten "gefällt" würde ich VaporiZed mit folgendem antworten wollen:

    VB.NET-Quellcode

    1. Private Sub MeineSub(QuellTextboxname As String, ZielTextboxname As String)
    2. Dim Quell As TextBox = Nothing
    3. Dim Ziel As TextBox = Nothing
    4. For Each ctl As Control In Me.Controls
    5. If TypeOf (ctl) Is TextBox Then
    6. If QuellTextboxname = ctl.Name Then Quell = ctl
    7. If ZielTextboxname = ctl.Name Then Ziel = ctl
    8. End If
    9. Next
    10. If IsNothing(Quell) Or IsNothing(Ziel) Then Exit Sub
    11. Ziel.Text = Quell.Text
    12. End Sub


    Zu dem favorisierten Code würde ich folgendes schreiben - derzeit nur in VS getippt!

    VB.NET-Quellcode

    1. Private Sub MeineSub2(idx_from As Integer, idx_to As Integer)
    2. Me.Controls("main_destinationintref" & idx_to.ToString).Text = Me.Controls("main_destinationintref" & idx_from.ToString).Text
    3. End Sub


    Gab wohl zeitliche Überschneidungen in meinem Codieren und den anderen Postings.

    Gruß Jan


    Habe das eben einmal ausprobiert mit dem Code
    Private Sub copy_lanes_from_to(idx_from As Integer, idx_to As Integer)
    Me.Controls("main_destinationintref_" & idx_to.ToString).Text = Me.Controls("main_destinationintref_" & idx_from.ToString).Text
    Me.Controls("main_destination_" & idx_to.ToString).Text = Me.Controls("main_destination_" & idx_from.ToString).Text
    End Sub

    VB.NET-Quellcode

    1. Bekomme aber gleich für die erste Zeile folgende Fehlermeldung:
    2. [quote]Ein Ausnahmefehler des Typs "System.NullReferenceException" ist in JT_Destination.exe aufgetreten.[/quote]
    3. Den zusammengesetzten Namen gibt es aber!
    4. [i]Irgendwo muss ich dann ja noch einen Fehler gemacht haben ???
    5. [/i]

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

    jan99 schrieb:

    Den zusammengesetzten Namen gibt es aber!
    Setze einen Haltepunkt drauf und stell fest, was da Nothing ist. Lerne zu debuggen, gugst Du hier.
    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!
    Du solltest dringend den Rat von @RodFromGermany beachten. Du bist ziemlich auf dem Holzweg.

    Erkläre doch mal (ohne Code) was Dein Programm letztendlich machen soll.
    Die Unendlichkeit ist weit. Vor allem gegen Ende. ?(
    Manche Menschen sind gar nicht dumm. Sie haben nur Pech beim Denken. 8o
    Moin!

    es geht ja um

    VB.NET-Quellcode

    1. Private Sub MeineSub2(idx_from As Integer, idx_to As Integer)
    2. Me.Controls("main_destinationintref" & idx_to.ToString).Text = Me.Controls("main_destinationintref" & idx_from.ToString).Text
    3. End Sub


    Hier soll ein Name zusammengebaut werden und diese soll main_destinationintref_1 ergeben.

    Wenn ich meinen Haltepunkt betrachte, dann kommen da folgende Werte bei raus - aber ich verstehe nicht, warum Me.Controls("main_destinationintref_" & idx_to.ToString) ein NOTHING liefert - Controlname ist doch vergeben!

    Gruß Jan
    Tja, Du läufst genau in das, was Dir in Post 5 prophezeit wurde. Controls über den Namen anzusprechen ist nicht das, was man machen sollte. Darum fragte ich Dich nach Deinem allgemeinen Vorhaben und dann kann man Dir einen passenden Lösungsweg vorschlagen.
    Die Unendlichkeit ist weit. Vor allem gegen Ende. ?(
    Manche Menschen sind gar nicht dumm. Sie haben nur Pech beim Denken. 8o

    jan99 schrieb:

    warum Me.Controls("main_destinationintref_" & idx_to.ToString) ein NOTHING liefert
    Kann es sein, dass da einfach ein Unterstrich _ fehlt?
    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!
    Aber wo ist den dann das Problem?
    Herangehensweise:
    Text aus Txtbox 3 herausfinden
    Name der Txtbox2 ermitteln
    Txtbox2 leeren, wenn voll
    Text von Txtbox3 in Txtbox2 verschieben > Txtbox2.text = Txtbox3.text
    Text aus Txtbox3 löschen

    Das ganze im Button Event in Code umzusetzen sollte kein Problem sein oder?

    Oder verstehe ich dein Vorhaben komplett falsch?
    Hi !

    das ist das einfache Beispiel!

    Im Grunde möchte ich eine Funktion haben um Werte von A nach B zu kopieren und diesen Source nur einmal haben.

    Dann bekommen die Funktionsaufrufe die Parameter

    Button 1
    3,2
    Button 2
    2,1
    Button 3
    3,2
    2,1

    zugewiesen - ein Code, dreimal genutzt!

    Verständlicher?

    Gruß Jan
    Dann ein Problem nach dem anderen: Mach die knallharte Überprüfungsvariante, in dem Du Dir den Namen einer TextBox in ne String-Variable (Var1) speicherst und den in Deinem Code-Konstrukt zusammengestellten in eine andere (Var2). Dann der einfache Vergleich mit:
    MessageBox.Show(Var1 & ": " & Var1.Length() & Environment.NewLine & Var2 & ": " & Var2.Length())
    Wenn da kein Unterschied ersichtlich ist, dann noch die ganz krasse Variante, indem Du alle Chars von Var1 mit denen von Var2 vergleichst, jeweils natürlich an der selben Position. Spätestens da müsste n Unterschied kommen, denn bei mir funktioniert das CE-Namen-Zusammenbasteln ohne Probleme.

    Nach den Grundsatzzweck des ganzen habe nicht nur ich schon mehrmals gefragt, also können wir wohl Grundsatzalternativlösungen aus Unwissenheit in die Tonne treten.
    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.
    Hallo Jan

    jan99 schrieb:

    warum Me.Controls("main_destinationintref_" & idx_to.ToString) ein NOTHING liefert

    So wie ich in deinem Bild in Post 13 erahnen kann, liegen deine Control in einem Container und nicht direkt auf der Form.
    Ergo musst du den ganzen Pfad zum Control angeben.
    z.B. dein Control liegt in einem Panel namens "Panel1", lautet der ganze Pfad dazu-> Me.Panel1.Controls("main_destinationintref_" & idx_to.ToString)

    Gruss HenryV
    Leg dir eine Metohde an die das Kopieren der Texte für dich übernimmt.
    Die Signatur könnte/sollte CopyTo(TextBox source, TextBox destination) sein. Dann kannst du im ButtonClick die Metohde CopyTo(TextBox1,TextBox2) aufrufen.