VisualBasic Variable soll wert von Button annehmen

morpheuss

Lt. Junior Grade
Registriert
Feb. 2004
Beiträge
274
Hallo,

ich habe ein kleines problem mit visual basic 2008.

Ich will eine variable deklarieren die ich nachher in meine select case funktion einbringen will.

Die variable soll folgendes machen.

Ich habe mehrere buttons. Die Buttons haben einen wert vom dem *.tag.

"button.tag" dabei kann ich in der form angeben das zb. button1.tag den wert 1 hat.

Ich will nun eine variable womit ich mehrere buttons einbringe, die variable soll dann den wert weiter leiten, auf den button den ich grade gedrückt habe.

zb. soll dann button2.tag der wer 2 weiter an die variable weiter geleitet werden die ich dann nachher in meine select case funktion einbringe...

Ich hoffe das war verständlich geschrieben.

Danke für euer antworten.
 
Ich hoffe das war verständlich geschrieben.
Nö. :D Willst du wissen, welcher Button betätigt wurde? Im Click-Eventhandler ist das Argument 'sender' das auslösende Objekt, also der Button. Mit dem Is-Operator kannst du Referenzen vergleichen, also z.B.:

Code:
if sender is Button1 then
'...
elseif sender is button2 then
'...
elseif sender is button2 then
'...
endif

Select Case geht nicht mit Referenzen bzw nur etwas umständlicher:

Code:
select case True
sender is Button1
sender is button2
'...
end select

Sag mir, ob ich das so richtig verstanden habe.
Ergänzung ()

Solltest du die Tag-Eigenschaft nicht zur Identifizierung des Buttons verwenden wollen - so hatte ich es aber verstanden - dann musst du 'sender' nach Control casten und kannst dann auf die Eigenschaft zugreifen. Ich gehe davon aus, dass du das im Click-Eventhandler machen willst.

Also:
Code:
dim tag [as string]= directcast(sender, control).tag.tostring
Das in eckigen Klammern ist optional falls du Option Infer Off verwendest.
 
ja das ist schon genau das richtige mit dem select case...

nur leider meckert der ein bisschen mit den variabeln typen rum...


hab das jetzt so gemacht:

Private Sub BT_1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BT_1_Aussen.Click

Call kette(1)

End Sub
Private Sub BT_2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BT_2_Aussen.Click


Call kette(2)
End Sub

Public Sub kette(ByVal sender As System.Object)


Select Case True
Case sender Is BT_1
Label1.BackColor = Color.Red
Case sender Is BT_2
Label2.BackColor = Color.Red
End select


nur leider klappt das nicht. der macht die labels nicht rot...
 
Wenn du ohnehin pro Button einen Eventhandler hast, dann weißt du doch, welcher Button geklickt wurde! Das legst du über die Handles-Klausel schon fest. Insofern ist immer noch nicht klar, was du eigentlich willst.

Dass die Labels nicht rot werden, liegt daran, dass du die Integer-Werte 1 und 2 an die Sub Kette übergibst. In der Sub wird jedoch geprüft, ob BT_1 oder BT_2 übergeben wurde.

Verwirrenderweise kommt hinzu, dass du einmal "BT_1" in der Case-Zeile stehen hast, während du "BT_1_Aussen" bei der Handles-Klausel angibst. Was ist nu richtig?

Also: Wenn du beim Click auf BT_1 das Label1 und bei BT_2 das Label2 rot haben willst, dann kannst du das mit einem oder mit zwei Eventhandler realisieren.
Mit zwei:
Code:
   Private Sub BT_1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BT_1.Click
      Label1.BackColor = Color.Red
   End Sub
   Private Sub BT_2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles bt_2.Click
      Label2.BackColor = Color.Red
   End Sub
Mit einem:
Code:
   Private Sub BT_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles bt_1.Click, bt_2.Click
      Select Case True
         Case sender Is BT_1
            Label1.BackColor = Color.Red
         Case sender Is bt_2
            Label2.BackColor = Color.Red
      End Select
   End Sub
Oder alternativ auch mit einem Handler:
Code:
      Dim lbl As Label

      Select Case True
         Case sender Is BT_1
            lbl = Label1
         Case sender Is bt_2
            lbl = Label2
      End Select

      lbl.BackColor = Color.Red
 
Zuletzt bearbeitet: (korrigiert: bt_2.click -> bt_1.click)
Warum so umständlich?
Warum nicht ne "globale" Variable, die du bei jedem Button einfach mit dem gewünschten Wert setzt? Also ganz ohne Switch oder If-Abfragen... einfach im Button-Handler der Variable den neuen Wert zuweisen...
Oder sind globale Variablen so verpöhnt?
 
Was ist daran umständlich? Wenn du zwei Eventhandler verwendest, wie ich es ja auch vorgeschlagen habe, sparst du dir auch die Variable. Das "Select Case" habe ich nur ausgeführt, weil danach gefragt wurde. Etwas Grundlagen-Know-How schadet nicht.
 
Ich habe das benutzt klappt wunderbar!!! vielen dank nochmal.

Code:

if sender is Button1 then
'...
elseif sender is button2 then
'...
elseif sender is button2 then
'...
endif

ich wollte es so machen weil dann mein programm auf einer anderen schreibweise sehr schnell unübersichtlich wird!

eine kleine neben frage noch... ist es möglich die "schritte" nacheinander aufzurufen?
 
also meinte das so...


if sender is Button1 then ( das ist schritt 1)
'...
elseif sender is button2 then(schritt2)
'...
elseif sender is button3 then(schritt3)
'...
endif

Ist es möglich das wenn ich auf button 3 drücke das er dann button 1 und 2 auch noch betätigt(automatisch)?
 
Ich gehe im folgenden davon aus, dass beim Click auf Button2 auch der Code für Button1 ausgeführt werden soll.

Theoretisch köntest du "Button1.PerformClick" und "Button2.PerformClick" aufrufen. Stilistisch wird das weniger gerne gesehen, denn die Buttons wurden ja nicht angeklickt und außerdem ist das ein Umweg. Stattdessen sollte man direkt den Code aufrufen, der auch beim Click auf den jeweiligen Button ausgeführt wird.

Edit: Variante 1 geändert. Siehe Bemerkung unten.
Variante 1:
Code:
      If sender Is Button1 OrElse sender Is Button2 OrElse sender Is Button3 Then
         Code1()
      End If

      If sender Is Button2 OrElse sender Is Button3 Then
         Code2()
      End If

      If sender Is Button3 Then
         Code3()
      End If

Variante 2:
Code:
      If sender Is Button1 Then
         Code1()
      ElseIf sender Is Button2 Then
         Code1()
         Code2()
      ElseIf sender Is Button3 Then
         Code1()
         Code2()
         Code3()
      End If

   'Der Code liegt dann in den jeweiligen Subs:
   Sub Code1()
   End Sub
   Sub Code2()
   End Sub
   Sub Code3()
   End Sub
Ergänzung ()

Halt, zurück! Das war Unsinn. Variante 1 war falsch. Mein Fehler. Entschuldigung!
 
Zuletzt bearbeitet:
kannst natürlich auch
Handles button1 ...
auswahl(1)

handles button2
auswahl(2)

Sub auswahl(byval wahl as Integer)
Select case wahl
Case 1
...
case 2
...
usw.
 
Zurück
Oben