Der Vb. Net Sender- und e-Ereignisparameter

In VB6 war eine Ereignis-Subroutine wie Button1_Click viel weniger kompliziert, da das System die Subroutine ausschließlich beim Namen nannte. 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 VB.NET SOOPercharged (das ist "OOP" für Objekt orientierte Programmierung).

  1. Die "Handles" -Klausel steuert, ob das System die Unterroutine aufruft, nicht den Namen.
  2. Die Parameter sender und e werden an das Unterprogramm übergeben.

Verwendung von Parametern

Schauen wir uns ein einfaches Beispiel an, um den Unterschied zu sehen, den Parameter in VB.NET bewirken.

Private Sub Button1_Click ( 

 ByVal Absender als System. Objekt,

 ByVal e As System. EventArgs

 ) Behandelt Button1.Click

 'Ihr Code geht hier

End Sub

Ereignisunterprogramme erhalten immer ein "Absender" -Objekt und einen System-EventArgs-Parameter "e". Da der Parameter EventArgs ein Objekt ist, unterstützt er alle erforderlichen Eigenschaften und Methoden. Zum Beispiel empfing die alte VB6 MouseMove-Ereignisunterroutine vier Parameter:

instagram viewer
  • Schaltfläche als Ganzzahl
  • Als Ganzzahl verschieben
  • X als Single
  • Y als Single

Als fortgeschrittenere Mäuse mit mehr Tasten herauskamen, hatte VB6 ein echtes Problem damit, sie zu unterstützen. VB.NET übergibt nur einen MouseEventArgs-Parameter, unterstützt jedoch viel mehr Eigenschaften und Methoden. Und jedes von ihnen sind Objekte, die noch mehr unterstützen. Zum Beispiel die e. Die Button-Eigenschaft enthält alle folgenden Eigenschaften:

  • Links
  • Mitte
  • Richtig
  • Keiner
  • XButton1
  • XButton2

Wenn jemand eine "trancendental" -Maus mit einer "virtuellen" Schaltfläche 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 in demselben von Windows verwendeten Bild zusammenführen. 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 an das OnPaint-Ereignis übergeben mit dem PaintEventArgs-Objekt.

Geschützte Überschreibungen Sub OnPaint (

 ByVal e As System. Windows. Formen. PaintEventArgs)

 Dim g As Graphics = e. Grafik

Andere Beispiele

Was können Sie mit diesen Parametern noch tun? Angenommen, Sie möchten herausfinden, ob eine Zeichenfolge, möglicherweise etwas, das Sie in eine Textbox eingegeben haben, in einer Sammlung anderer Textboxen vorhanden ist, wenn Sie auf eine klicken. Sie können ein paar Dutzend praktisch identische Unterprogramme für jedes Textfeld codieren:

Wenn TextBox42.Text. Index von(

 Suchbegriff. Text) = -1 

 Dann NotFound. Text = 

 "Nicht gefunden"

Aber es ist viel einfacher, nur einen zu codieren und alle verarbeiten zu lassen. Der Absenderparameter zeigt an, auf welches Textfeld geklickt wurde.

Private Sub FindIt (

 ByVal Absender als System. Objekt,

 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. Index von( 

 Suchbegriff. Text)

 Wenn IndexChar = -1, dann _

 Nicht gefunden. Text = "Nicht gefunden" _

 Sonst _

 Nicht gefunden. 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

 Dim myListBox As New ListBox

 myListBox = Absender

 myListBox. Artikel. RemoveAt (myListBox. SelectedIndex)

End Sub

Ein weiteres Beispiel, um den Punkt zu verdeutlichen, ist eine Frage, die Pierre in Belgien eingereicht 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 beide 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. Überprüfen wir zunächst die Microsoft-Dokumentation für die 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 False.

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, aber Sie können einen Wert in Tag oder sogar in der Location-Eigenschaft testen.

Dieser Code funktioniert:

Dim myButton As Button

myButton = Absender

Wenn myButton. Text = "Button1" Dann