Alle Buttons in der UserForm überwachen

  • VB.NET

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

    Alle Buttons in der UserForm überwachen

    Hallo.
    Ich habe folgendes Problem. Ich habe eine UserForm mit 400 Buttons.
    Zwei Buttons verändern je einen bestimmten Wert.
    Um nicht für jeden Button den Quellcode zu schreiben, wollte ich ermitteln welcher Button gedrückt wurde und dementsprechend weiterverfahren.
    Ich habe aber im moment keine Idee wie ich das realisieren kann.
    Kann mir jemand helfen?
    Ich bin ein wenig verwirrt. Du redest von einer UserForm (kenne ich aus VBA), aber der Titelpräfix sagt VB2010?
    Für VB2010: Du kannst für alle Buttons eine einzige Handling-Methode definieren. Dort kannst du über den sender-Parameter auf den gedrückten Buttons zugreifen.

    Viele Grüße, Phil.
    Wird bei 100 Button nur etwas mehr Schreibarbeit:

    VB.NET-Quellcode

    1. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click, Button2.Click, Button3.Click, Button4.Click
    2. If sender Is Button1 Then
    3. ' Button1 gedrückt
    4. ElseIf sender Is Button2 Then
    5. ' Button2 gedrückt
    6. ElseIf sender Is Button3 Then
    7. ' Button3 gedrückt
    8. ElseIf sender Is Button4 Then
    9. ' Button4 gedrückt
    10. End If
    11. End Sub
    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!
    Dir ist klar, dass Du schon irgendwo alle 400 Button durchleiern musst?
    Klar kannst Du Deine 400 Button in ein Array packen und dann mit einer Schleife durchleiern:

    VB.NET-Quellcode

    1. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click, Button2.Click, Button3.Click, Button4.Click, Button5.Click ' usw.
    2. Dim bb() As Button = New Button() {Button1, Button2, Button3, Button4, Button5} ' usw.
    3. For Each btn In bb
    4. If sender Is btn Then
    5. ' hier hast Du ihn gefunden
    6. Exit For
    7. End If
    8. Next
    9. End Sub
    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!
    Wenn die Buttons alle schön durchnummeriert sind, wäre auch das eine Möglichkeit:

    VB.NET-Quellcode

    1. Public Class AlotOfButtons Inherits Form
    2. ' Load-Event
    3. Public Sub OnLoad(ByVal Sender As Object, ByVal Ev As EventArgs) Handles MyBase.Load
    4. For i As Integer = 0 To 400 ' 400 durch die Anzahl der Buttons ersetzen
    5. Dim Cntrl As Control = Controls("Button" & i.ToString())
    6. If TypeOf Cntrl IsNot Button Then Continue
    7. AddHandler DirectCast(Cntrl, Button).Click, AddressOf OnButtonClick
    8. Next
    9. End Sub
    10. Public Sub OnButtonClick(ByVal Sender As Object, ByVal Ev As EventArgs)
    11. Dim Btn As Button = DirectCast(Sender, Button)
    12. ' Mit Btn weiterarbeiten
    13. End Sub
    14. End Class
    @haiyyu: Sicherlich eine kurze Lösung, doch ist das kein Programmierstil, ein Control über seinen Namen anzusprechen.
    Außerdem ist dies an eine starre Namensgebung gebunden, Du kannst ein Control nicht mal schnell umbenennenn.
    @FrankTheTank: Was ist das überhaupt für eine Anwendung, in der 400 Button in einer Form vorkommen?
    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!
    Danke erst mal für die Tipps.
    Nun kann ich die Buttons abfragen.
    Noch habe ich folgendes Problem, die Buttons sind Durchnummeriert, genau wie die Labels in Meiner Form.
    Ich habe nun einen Wert (10) aus dem Button erhalten, und möchte nun eine Label ändern welches "Label10" lautet.
    Wie kann ich das Label ansprechen.
    Ich habe es so versucht, funktioiert aber nicht.

    VB.NET-Quellcode

    1. L = "Label" & Wert
    2. L.Text = CInt(L.Text) + 1
    wie gesagt: 400 buttons und vlt noch 400Labels sind vmtl. ein DesignFehler, und ich täte mal überlegen, ob man mit einem DataGridView, welches zB eine ButtonDataGridViewColumn enthält, nicht wirklich weiter käme.
    Ein DGV mit 400 Zellen, oder auch 800 ist ja kein son ResourcenProblem.
    Für mich hört sich das nach dem Versuch an, sowas wie Minesweeper laienhaft zu programmieren ^^
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    ... Nun solltest es selber wissen. :'D
    Hallo.
    Es wird kein Minsweeper.
    Es soll ein Programm zur Optischen Verwaltung der Kartensammlung meiner Kinder werden.
    Im Anhang mal ein Beispielbild, Dort kommt noch das passende Bild rein.

    Wenn man das auch einfacher lösen kann dann sagt es mir. Aber die Optik sollte schon so aussehen.
    Ich Kann immer noch nicht das Label ansprechen (Name="Label18", Text="Anzahl: 0"). Bitte helft mir.
    Bilder
    • Beispiel.jpg

      6,2 kB, 163×257, 185 mal angesehen

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

    Dies ist nur ein Ausschnitt die Buttons sind die "+" und "-" Buttons. Da es 200 Karten gibt gibt es von jedem "+" sowie "-" Button je 200 Stück.
    Ich habe folgendes versucht um die Labels anzusprechen. Aber das geht nicht (NullReferenceException wurde nicht behandelt).

    VB.NET-Quellcode

    1. Wert=1
    2. Me.Controls("Label" & Wert.ToString).Text="TEXT"

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