Vb.Net Sender și e Parametrii evenimentului

În VB6, o subrutină de evenimente, cum ar fi Button1_Click, a fost mult mai puțin complicată, deoarece sistemul a numit subrutină strict după nume. Dacă a existat un eveniment Button1_Click, sistemul îl numea. Este direct și simplu.

Dar în VB.NET, există două upgrade-uri majore care fac VB.NET SOOPercharged (adică „OOP” pentru programarea orientată pe obiect).

  1. Clauza „Handles” controlează dacă sistemul numește subrutină, nu numele.
  2. Parametrii expeditorului și e sunt trecuți la subrutină.

Utilizarea parametrilor

Să ne uităm la un exemplu simplu pentru a vedea diferența pe care o fac parametrii în VB.NET.

Sub-buton privat1_Click ( 

 Expeditor ByVal ca System.Object,

 ByVal e As System.EventArgs

 ) Butoane Manevre1.Click

 - Codul tău merge aici

Sub final

Subrutinele de evenimente primesc întotdeauna un obiect "expeditor" și un parametru "e" EventArgs de sistem. Deoarece parametrul EventArgs este un obiect, acesta acceptă orice proprietăți și metode sunt necesare. De exemplu, vechea subrutină a evenimentului VB6 MouseMove folosit pentru a primi patru parametri:

  • Buton ca număr întreg
  • Shift As Integer
  • X Ca single
  • Y ca singur

Când șoarecii mai avansați au apărut cu mai multe butoane, VB6 a avut o problemă reală în sprijinirea lor. VB.NET trece doar un parametru MouseEventArgs, dar acceptă mai multe proprietăți și metode. Și fiecare dintre ele sunt obiecte care susțin și mai mult. De exemplu, proprietatea e.Button conține toate aceste proprietăți:

  • Stânga
  • Mijloc
  • Dreapta
  • Nici unul
  • XButton1
  • XButton2

Dacă cineva inventează un mouse „trancendental” cu un buton „virtual”, VB.NET va trebui să actualizeze doar .NET Framework pentru a-l susține și niciun cod anterior nu se va rupe..

Există o serie de tehnologii .NET care depind absolut de acești parametri. De exemplu, deoarece computerul dvs. are de obicei doar un singur ecran pentru a afișa grafică, codul dvs. trebuie să îmbine graficele pe care le creează în aceeași imagine folosită de Windows. Din acest motiv, trebuie împărțit un singur obiect „grafic”. Principalul mod în care codul dvs. este capabil să folosească acel obiect „grafic” este să folosiți parametrul e care a fost trecut la evenimentul OnPaint cu obiectul PaintEventArgs..

Substituiri protejate Sub OnPaint (

 ByVal e As System.Windows.Forms.PaintEventArgs)

 Dim g As Graphics = e.Graphics

Alte exemple

Ce mai poți face cu acești parametri? Pentru a ilustra, să presupunem că doriți să aflați dacă un șir, poate ceva introdus într-o casetă de text, există în oricare dintre colecțiile de alte casete de text atunci când faceți clic pe una. Puteți codifica câteva zeci de subrutine practic identice pentru fiecare casetă de text:

Dacă TextBox42.Text.IndexOf (

 SearchString.Text) = -1 

 Apoi NotFound.Text = 

 "Nu a fost gasit"

Dar este mult mai ușor să codați doar unul și să-l lăsați să se ocupe de toate. Parametrul expeditorului va dezvălui ce cutie text a fost făcut clic.

Sub-Find privat (

 Expeditor ByVal ca System.Object,

 ByVal e As System.EventArgs

 ) Gestionează TextBox1.Enter, 

 TextBox2.Enter, 

… ș.a.m.d… 

 TextBox42.Enter

 Dim myTextbox Ca TextBox

 myTextbox = expeditor

 Dim IndexChar As Integer = 

 myTextbox.Text.IndexOf ( 

 SearchString.Text)

 Dacă IndexChar = -1 Atunci _

 NotFound.Text = "Nu a fost găsit" _

 Altfel _

 NotFound.Text = "Găsit!"

 Sub final

Recent, un programator mi-a cerut o modalitate mai bună de a „șterge linia pe care s-a făcut clic pe oricare dintre cele șase liste specificate”. El a lucrat în câteva zeci de linii de cod care pur și simplu m-au confundat. Dar folosind expeditor, a fost foarte simplu:

Sublista privatăBox_Click ( 

 Expeditor ByVal ca obiect, 

 ByVal e As System.EventArgs

 ) Gestionează ListBox1.Click, ListBox2.Click

 Dim myListBox Ca listă nouă

 myListBox = expeditor

 myListBox.Items.RemoveAt (myListBox.SelectedIndex)

Sub final

Un alt exemplu pentru a pune problema este o întrebare care a fost trimisă de Pierre în Belgia. Pierre testa egalitatea Button1 și a expeditorului folosind Este operator pentru obiecte:

Dacă expeditorul este butonul1 Atunci ... 

Acest lucru este corect sintactic, deoarece expeditorul și Button1 sunt ambele obiecte la care se poate face referire. Și din moment ce expeditorul este într-adevăr identic cu Button1, de ce nu funcționează?

Răspunsul depinde de un cuvânt cheie care se găsește puțin mai devreme în enunț. Mai întâi, să verificăm documentația Microsoft pentru Este operator.

Visual Basic compară două variabile de referință de obiect cu operatorul Is. Acest operator stabilește dacă două variabile de referință se referă la aceeași instanță a obiectului.

Observați că expeditorul a fost trecut ByVal. Aceasta înseamnă că o copie a butonului1 este transmisă, nu obiectul propriu-zis. Deci, când Pierre testează pentru a vedea dacă expeditorul și Button1 sunt aceeași instanță, rezultatul este False.

Pentru a testa dacă a fost făcut clic pe Button1 sau Button2, trebuie să transformați expeditorul într-un obiect Button real și apoi să testați o proprietate a acelui obiect. Textul este de obicei utilizat, dar puteți testa o valoare în etichetă sau chiar proprietatea Locație.

Acest cod funcționează:

Dim myButton As Button

myButton = expeditor

Dacă myButton.Text = "Buton1" Atunci