In VB6 war eine Ereignis-Unterroutine wie Button1_Click wesentlich unkomplizierter, da das System die Unterroutine ausschließlich nach Namen aufrief. Wenn ein Button1_Click-Ereignis vorhanden war, hat das System es aufgerufen. Es ist direkt und unkompliziert.
In VB.NET gibt es jedoch zwei wichtige Upgrades, die VB.NET SOOPercharged machen (das ist "OOP" für objektorientierte Programmierung)..
Schauen wir uns ein einfaches Beispiel an, um den Unterschied zu sehen, den Parameter in VB.NET ausmachen.
Private Sub Button1_Click (
ByVal Absender As System.Object,
ByVal e As System.EventArgs
) Behandelt Button1.Click
'Ihr Code geht hier
End Sub
Ereignis-Unterprogramme erhalten immer ein "Sender" -Objekt und einen System-EventArgs-Parameter "e". Da der EventArgs-Parameter ein Objekt ist, werden alle erforderlichen Eigenschaften und Methoden unterstützt. Zum Beispiel die alte VB6-MouseMove-Ereignis-Subroutine, die zum Empfangen von vier Parametern verwendet wurde:
Als fortgeschrittenere Mäuse mit mehr Tasten herauskamen, hatte VB6 ein echtes Problem, sie zu unterstützen. VB.NET übergibt nur einen MouseEventArgs-Parameter, unterstützt jedoch wesentlich mehr Eigenschaften und Methoden. Und jedes von ihnen sind Objekte, die noch mehr unterstützen. Die Eigenschaft e.Button enthält beispielsweise alle folgenden Eigenschaften:
Wenn jemand eine "trancendentale" Maus mit einer "virtuellen" Taste erfindet, muss VB.NET nur das .NET Framework aktualisieren, um dies zu unterstützen, und kein vorheriger Code wird dadurch beschädigt.
Es gibt eine Reihe von .NET-Technologien, die absolut von diesen Parametern abhängen. Da Ihr PC normalerweise nur einen einzigen Bildschirm zum Anzeigen von Grafiken hat, muss Ihr Code die von ihm erstellten Grafiken zu demselben Bild zusammenführen, das von Windows verwendet wird. Aus diesem Grund muss ein einzelnes "Grafik" -Objekt gemeinsam genutzt werden. Die Hauptmethode, mit der Ihr Code dieses "Grafik" -Objekt verwenden kann, ist die Verwendung des Parameters e, der mit dem PaintEventArgs-Objekt an das OnPaint-Ereignis übergeben wird.
Geschützte Überschreibungen Sub OnPaint (
ByVal e As System.Windows.Forms.PaintEventArgs)
Dim g As Graphics = e.Graphics
Was können Sie mit diesen Parametern noch tun? Nehmen wir zur Veranschaulichung an, Sie möchten herausfinden, ob eine Zeichenfolge, die Sie möglicherweise in eine Textbox eingegeben haben, in einer Sammlung anderer Textboxen vorhanden ist, wenn Sie auf eine klicken. Sie können für jedes Textfeld ein paar Dutzend praktisch identische Unterroutinen programmieren:
Wenn TextBox42.Text.IndexOf (
SearchString.Text) = -1
Dann NotFound.Text =
"Nicht gefunden"
Aber es ist viel einfacher, nur einen Code zu erstellen und alle zu verwalten. Der Absenderparameter zeigt an, auf welches Textfeld geklickt wurde.
Private Sub FindIt (
ByVal Absender As System.Object,
ByVal e As System.EventArgs
) Behandelt TextBox1.Enter,
TextBox2.Enter,
… und weiter und weiter…
TextBox42.Enter
Dim myTextbox As TextBox
myTextbox = Absender
Dim IndexChar As Integer =
myTextbox.Text.IndexOf (
SearchString.Text)
Wenn IndexChar = -1, dann _
NotFound.Text = "Nicht gefunden" _
Sonst _
NotFound.Text = "Gefunden!"
End Sub
Kürzlich fragte mich ein Programmierer nach einer besseren Möglichkeit, "die Zeile zu löschen, auf die in einer der sechs angegebenen Listen geklickt wurde". Er ließ es in ein paar Dutzend Codezeilen arbeiten, die mich einfach verwirrten. Aber mit dem Absender war es wirklich ganz einfach:
Private Sub ListBox_Click (
ByVal Absender als Objekt,
ByVal e As System.EventArgs
) Behandelt ListBox1.Click, ListBox2.Click
MyListBox als neue ListBox dimmen
myListBox = Absender
myListBox.Items.RemoveAt (myListBox.SelectedIndex)
End Sub
Ein weiteres Beispiel, um den Punkt festzunageln, ist eine Frage, die Pierre in Belgien eingeschickt hat. Pierre testete die Gleichheit von Button1 und Absender mit dem Ist Operator für Objekte:
Wenn der Absender Button1 ist, dann ...
Dies ist syntaktisch korrekt, da Absender und Button1 Objekte sind, auf die verwiesen werden kann. Und da der Absender wirklich mit Button1 identisch ist, warum funktioniert es nicht??
Die Antwort hängt von einem Schlüsselwort ab, das etwas früher in der Anweisung gefunden wurde. Schauen wir uns zunächst die Microsoft-Dokumentation für an Ist Operator.
Visual Basic vergleicht zwei Objektreferenzvariablen mit dem Is-Operator. Dieser Operator bestimmt, ob zwei Referenzvariablen auf dieselbe Objektinstanz verweisen.
Beachten Sie, dass der Absender übergeben wird ByVal. Das bedeutet, dass eine Kopie von Button1 übergeben wird, nicht das eigentliche Objekt. Wenn Pierre also prüft, ob Absender und Button1 dieselbe Instanz sind, ist das Ergebnis Falsch.
Um zu testen, ob auf Button1 oder Button2 geklickt wurde, müssen Sie den Absender in ein tatsächliches Button-Objekt verwandeln und dann eine Eigenschaft dieses Objekts testen. Normalerweise wird Text verwendet, Sie können jedoch einen Wert in Tag oder sogar in der Location-Eigenschaft testen.
Dieser Code funktioniert:
MyButton als Button dimmen
myButton = Absender
If myButton.Text = "Button1" Then