Hilfe: Objektnamen durch Variablen ausdrücken?

  • VB.NET

Es gibt 19 Antworten in diesem Thema. Der letzte Beitrag () ist von picoflop.

    Hilfe: Objektnamen durch Variablen ausdrücken?

    Hallo Leute,

    ich hab gestern damit begonnen mich ein bisschen in Visual Basic 2008 einzuarbeiten. Ich bin gerade in einer Situation, bei der ich versuche einen haufen Textboxes mit einer For-Schleife zu löschen.

    Das Ganze hab ich mir in etwa so vorgestellt:

    VB.NET-Quellcode

    1. For i As Integer = 1 To 26
    2. TextBox1.Text = ""
    3. Next


    Ich hab genau 26 Textboxes, würde die gerne alle auf einmal löschen und die Nummerierung durch die Variable i ersetzen. Ist das möglich?

    Grüße,
    Fry12
    Probiers mal damit:

    VB.NET-Quellcode

    1. For Each box As Control In Form1.Controls
    2. If TypeOf box Is Textbox Then
    3. box.text = ""
    4. End If
    5. Next


    Setzt alle textboxen in Form1 auf "" wo Form1 steht kannst du natürlich auch

    VB.NET-Quellcode

    1. Panel1.controls, Groupbox1.controls usw...
    Danke für die schnelle Antwort! :)

    Funktioniert aber leider nicht, tut sich nichts wenn ich den Button drücke.

    Also ich hab jetzt hier stehen:

    VB.NET-Quellcode

    1. If booleanGefuellt = False Then
    2. 'Hier werden die Textboxes gefüllt....
    3. booleanGefuellt = True
    4. ElseIf booleanGefuellt = True Then
    5. For Each box As Control In Me.Controls
    6. If TypeOf box Is TextBox Then
    7. box.Text = ""
    8. End If
    9. Next
    10. booleanGefuellt = False
    11. End If


    booleanGefuellt erklärt sich von selbst denk ich.
    Ich vermut mal daran Liegts,

    Fry12 schrieb:

    ElseIf booleanGefuellt = True Then



    VB.NET-Quellcode

    1. Case booleanGefuellt
    2. case False
    3. booleanGefuellt = True
    4. Case True
    5. For Each box As Control In Me.Controls
    6. If TypeOf box Is TextBox Then
    7. box.Text = ""
    8. End Select
    9. Next
    10. booleanGefuellt = False


    Was ich nicht verstehe warum du einen Boolean einsetzt?, wenn er falsch ist setzt du ihn richtig, da kannst du dir den auch sparen.
    Also ich hab in dem Programm einen Menüpunkt. Der ist dazu da um die Textboxes aufzufüllen und wenn man nochmal drückt, sie wieder zu entleeren. Bei Programmstart steht noch nichts in den Textboxes. Also hab ich eine Variable angelegt (booleangefuellt) und sie auf false gesetzt.
    Dann wird der Menüpunkt gedrückt, es wird durch das if abgefragt ob sie gefüllt sind oder nicht. Wenn sies dann nicht sind (false) werden sie mit Infos gefüllt und die Variable auf true gesetzt. Sind sie aber schon gefüllt(das ist dann das elseif) möcht ich den Inhalt gerne löschen.

    Ich hoff das war verständlich :P

    Achja: Da wo bei mir im Code oben 'Hier werden die Textboxes gefüllt.... steht, steht natürlich in echt was in die einzelnen Textboxes reingeschrieben werden soll.
    Hi
    Wenn es nicht wirklich eine TextBox ist, sondern eine abgeleitete Klasse, geht das ganze nicht. Du kannst das aber per box.GetType.IsSubclassOf() ermitteln, ob dies zutrifft.

    VB.NET-Quellcode

    1. For Each box As Control In Me.Controls
    2. If TypeOf box Is TextBox AndAlso box.GetType.IsSubclassOf(GetType(TextBox)) Then
    3. box.Text = ""
    4. End Select
    5. Next


    Da die meisten TextBoxen von TextBoxBase erben, kannst du die Abfrage auch mit box.GetType.IsSubclassOf(GetType(TextBoxBase)) erstellen und die TypeOf-Abfrage weglassen.

    Gruß
    ~blaze~
    Ich hoffe das kann die helfen:

    VB.NET-Quellcode

    1. Dim booleangefuellt As Boolean = False

    Im Menüpunkt_Click Event:

    VB.NET-Quellcode

    1. Select Case booleangefuellt
    2. Case False
    3. TextBox1.Text = "hallo"
    4. TextBox2.Text = "wie"
    5. TextBox3.Text = "geht's"
    6. TextBox4.Text = "dir?"
    7. booleangefuellt = True
    8. Case True
    9. For Each box As Control In Me.Controls
    10. If TypeOf box Is TextBox Then
    11. box.Text = ""
    12. End If
    13. Next
    14. booleangefuellt = False
    15. End Select
    Versuch mal zu testen ob die TextBox wirklich eine TextBox ist. Änder das einfach mal ab:

    VB.NET-Quellcode

    1. If TypeOf box Is TextBox Then
    2. box.Text = ""
    3. Else
    4. MsgBox("Keine TextBox!")
    5. End If

    Es könnte ja auch sein du hast statt einer TextBox eine RichTextBox genommen oder so!
    Wenn ich da jetzt beispielsweise textbox2 einsetze, also:

    VB.NET-Quellcode

    1. If TypeOf testbox2 Is TextBox Then
    2. testbox2.Text = ""
    3. Else
    4. MsgBox("Keine TextBox!")
    5. End If

    wird der Inhalt gelöscht. Also handelts sichs um Textboxen. Komisch ?(

    Also ich könnte ja eine Textbox nach der andern aufzählen, aber bei mind. 26 such ich eben nach einer eleganteren Lösung.
    Also, ich schätze es liegt an dem Boolean-Wert. Prüfe am besten, ob in den Boxen etwas drin ist, anstatt einen externen Boolean-Wert zu benutzen. Ansonsten funktioniert das hier hervorragend:

    VB.NET-Quellcode

    1. For Each box In Me.Controls
    2. If TypeOf box Is TextBox Then
    3. Dim tb As TextBox = box
    4. tb.Text = ""
    5. End If
    6. Next
    Versuch noch einmal damit. Mit dieser Schleife brauchst du keine Auflistung und keinen externen Boolean-Wert mehr. Wenn die Box leer ist, passiert nichts, wenn sie voll ist, wird der Text entfernt:

    VB.NET-Quellcode

    1. For Each box In Me.Controls
    2. If TypeOf box Is TextBox Then
    3. Dim tb As TextBox = box
    4. If tb.Text.Any() = True Then tb.Text = ""
    5. End If
    6. Next

    Müsste so schon gehen. Funktioniert bei mir prima.
    Funktioniert komischerweise auch nicht, aber was solls, jetzt hab ich eben einige Zeilen mehr im Quellcode.

    Inzwischen bin ich auch schon viel weiter und steh vor einem klitzekleinen Problem:

    Ich möchte eine Zahl vom Typ Single ausgeben (Label) und zwar bis auf die zweite Nullstelle genau und nicht gleich auf die ersten paar Nullstellen. Wie macht man das?

    Grüße,
    Andi

    P.S.: Super Forum hier, genau das Richtige für Einsteiger (und eigentlich auch für alle anderen :P)
    Edit2: Okay, jetzt hab ich doch noch eine Frage:

    Also, ich habe jetzt zwei Forms und ein Modul. Jetzt würd ich gerne in das Modul ein Structure packen (das hab ich bereits getan) und auch dort Variablen von diesem Datentyp definieren. Allerdings funktioniert das nicht, den Variablen lässt sich keine Werte zuweisen und man kann auch nicht von den beiden Forms auf diese Variablen zugreifen.

    So sieht das Modul im Moment aus:

    VB.NET-Quellcode

    1. Module VariablenModul
    2. 'Gebaeudekosten-Structure:
    3. Structure Gebaeudekosten
    4. Public strGebaeudename As String
    5. Public intKosten As Integer
    6. End Structure
    7. End Module


    Wenn ich folgendes dazuschreibe:

    VB.NET-Quellcode

    1. Public TestGebaeude as Gebaeudekosten
    2. Testgebaeude.intKosten = 100
    3. Testgebaeude.strGebaeudename = "Haus"


    funktioniert das leider nicht. Es kommt nur die Meldung "Deklaration erwartet". Wer kann helfen?

    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „Fry12“ ()

    Wird leider immernoch eine Deklaration erwartet. Nachdem ich die Zeile

    VB.NET-Quellcode

    1. Public TestGebaeude As New Gebaeudekosten

    geschrieben hab, wird auch in der nächsten Zeile gar nichts vom Editor "angeboten" und sobald ich fertig geschrieben habe, kommt nur, dass eine Deklaration erwartet wird.
    Eine Structure oder Klasse sollte nicht INNERHALB eines Blocks deklariert werden. Denn dann ist sie auch nur innerhalb dieses Blocks gültig! Im Bsp. ist "Gebaeudekosten" nur innerhalb des Moduls gültig und kann demzufolge auch nur dort verwendet werden.