Alle Tools einer Form ansprechen

  • VB.NET

Es gibt 12 Antworten in diesem Thema. Der letzte Beitrag () ist von RodFromGermany.

    Alle Tools einer Form ansprechen

    Haiii Leute! :)

    Ich habe ein Form (s. Anlage) in der ich mehrere ComboBoxen und TextBoxen habe.


    Mein Ziel:
    Ich möchte den "speichern" -Button erst aktivieren, wenn alle ComboBoxen ausgewählt sind und alle TextBoxen gefüllt sind.
    Mein Lösungsansatz:
    Ich könnte jede ComboBox nach ihrem SelectedIndex abfragen, selbiges mit den TextBoxen mit der TextLength.... Nur finde ich dies ein bissl doof, da der Code ewig lang würde.
    Frage:
    Wie kann ich das ganze mit einer For Each - Schleife lösen?


    Dankeeee :D
    Bilder
    • 2.JPG

      33,07 kB, 442×375, 182 mal angesehen
    NAja ne Abfrage ob der selectedindex gleich 0 ist, falls ja die SChleife verlassen:

    VB.NET-Quellcode

    1. for each cbb in me.controls(...)
    2. if cbb.selected = 0 then
    3. exit sub
    4. else
    5. for each txt in me.controls(...)
    6. if ....
    7. next

    Oder:
    Spoiler anzeigen
    Bzw... mit LINQ:

    VB.NET-Quellcode

    1. Dim bool = (From cbb In TabPage2.Controls.OfType(Of ComboBox)()
    2. Where cbb.SelectedIndex > 0
    3. Select cbb).Count = TabPage2.Controls.OfType(Of ComboBox)().Count
    Ich würde es nun nach Durchsicht deiner tollen Lösungsvorschläge :thumbsup: so schreiben...

    VB.NET-Quellcode

    1. For Each ChBox In Me.Controls.OfType(Of ComboBox)()
    2. If ChBox.SelectedIndex < 0 Then
    3. Button1.Enabled = False
    4. Else
    5. Button1.Enabled = True
    6. End If
    7. Next


    In welches Event schreibe ich es am besten :?:
    mach den code im Button Click event allerdings nicht das du den Button an/aus machst
    sondern nur wen alle ausgefüllt sind das der weiter geht , wen nicht eine messagebox anzeigt wo drinsteht das alles ausgefüllt ist oder so ...
    Das Problem an Deiner Lösung ist allerdings, das der Button dann die ganze Zeit hin und her wechseln wird. Wenn in der ersten was drin steht wird er frei, wenn in der nächsten was steht wieder nich und so weiter... nicht ganz die optimale Lösung. Das ganze natürlich in die Change events der TExtboxen und Comboboxen...
    So in der Art:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Private Sub ComboBox1_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ComboBox1.SelectedIndexChanged, ComboBox2.SelectedIndexChanged, ComboBox3.SelectedIndexChanged
    2. Button11.Enabled = (From cbb In TabPage2.Controls.OfType(Of ComboBox)()
    3. Where cbb.SelectedIndex > 0
    4. Select cbb).Count = TabPage2.Controls.OfType(Of ComboBox)().Count AndAlso
    5. (From txt In TabPage2.Controls.OfType(Of TextBox)()
    6. Where txt.TextLength > 0
    7. Select txt).Count = TabPage2.Controls.OfType(Of TextBox)().Count
    8. End Sub
    9. Private Sub TextBox4_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TextBox4.TextChanged, TextBox5.TextChanged, TextBox6.TextChanged
    10. Button11.Enabled = (From txt In TabPage2.Controls.OfType(Of TextBox)()
    11. Where txt.TextLength > 0
    12. Select txt).Count = TabPage2.Controls.OfType(Of TextBox)().Count AndAlso
    13. (From cbb In TabPage2.Controls.OfType(Of ComboBox)()
    14. Where cbb.SelectedIndex > 0
    15. Select cbb).Count = TabPage2.Controls.OfType(Of ComboBox)().Count
    16. End Sub

    ODer in deiner Richtung:

    VB.NET-Quellcode

    1. Private Sub ComboBox1_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ComboBox1.SelectedIndexChanged, ComboBox2.SelectedIndexChanged, ComboBox3.SelectedIndexChanged
    2. For Each cbb In TabPage2.Controls.OfType(Of ComboBox)()
    3. If cbb.SelectedIndex = 0 Then Exit Sub
    4. Next
    5. For Each txt In TabPage2.Controls.OfType(Of TextBox)()
    6. If txt.TextLength = 0 Then Exit Sub
    7. Next
    8. Button11.Enabled = True
    9. End Sub
    Meinte es so :

    VB.NET-Quellcode

    1. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    2. For Each ChBox In Me.Controls.OfType(Of ComboBox)()
    3. If ChBox.SelectedIndex = 0 Then
    4. GoTo err
    5. End If
    6. Next
    7. For Each ChBox In Me.Controls.OfType(Of TextBox)()
    8. If ChBox.TextLength = 0 Then
    9. GoTo err
    10. End If
    11. Next
    12. MessageBox.Show("Danke das sie alles ausgefüllt haben")
    13. Exit Sub
    14. err:
    15. MessageBox.Show("Bitte alles ausfüllen")
    16. End Sub
    @TanoshiiSuta
    1. Wir schreiben VB2010 also bitte nich mehr mit goto error!
    2. Einfach den Button disablen und erst freischalten wenn alles augefüllt ist!
    3. MItteilungen an den NUtzer kann man über einen ToolTip auf den Button lösen.

    FreShmaKer schrieb:

    Ich möchte den "speichern" -Button erst aktivieren, wenn alle ComboBoxen ausgewählt sind und alle TextBoxen gefüllt sind.
    Das ist eine komplexe Logik, die bei neu hinzukommenden Controls nur noch komplexer wird.
    Im entsprechenden Change-Event jedes Controls rufst Du eine gemeinsame Test-Routine auf, die alle Bedingungen überprüft und den Button dann freigibt.
    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!