Vb. Net Sender och e Event Parametrar

I VB6 var en händelsunderrutin, som Button1_Click, mycket mindre komplicerad eftersom systemet kallade subroutinen strikt med namnet. Om en knapp1_Klickhändelse fanns, kallade systemet det. Det är direkt och enkelt.

Men i VB.NET finns det två stora uppgraderingar som gör VB.NET SOOPercharged (det är "OOP" för Objektorienterad programmering).

  1. "Handles" -klausulen styr huruvida systemet kallar subroutinen, inte namnet.
  2. Avsändar- och e-parametrarna skickas till subrutinen.

Användning av parametrar

Låt oss titta på ett enkelt exempel för att se skillnaden som parametrarna gör i VB.NET.

Privat subknapp1_Klicka ( 

 ByVal avsändare som system. Objekt,

 ByVal e As System. EventArgs

 ) Handtag-knapp1.Klicka

 "Din kod går här

Avsluta under

Underprogram för händelser får alltid ett "avsändare" -objekt och en system EventArgs-parameter "e". Eftersom parametern EventArgs är ett objekt, stöder den alla egenskaper och metoder som är nödvändiga. Till exempel den gamla VB6 MouseMove-händelsunderrutinen som användes för att ta emot fyra parametrar:

instagram viewer
  • Knapp som heltal
  • Skift som heltal
  • X som singel
  • Y som singel

När mer avancerade möss kom ut med fler knappar hade VB6 ett verkligt problem att stödja dem. VB.NET passerar bara en MouseEventArgs-parameter men den stöder mycket fler egenskaper och metoder. Och var och en av dem är föremål som stöder ännu mer. Till exempel e. Knappegenskapen innehåller alla dessa egenskaper:

  • Vänster
  • Mitten
  • Rätt
  • Ingen
  • XButton1
  • XButton2

Om någon uppfinner en "trancendental" mus med en "virtuell" knapp, måste VB.NET bara uppdatera .NET Framework för att stödja den och ingen tidigare kod kommer att gå sönder.

Det finns ett antal .NET-tekniker som helt beror på dessa parametrar. Till exempel, eftersom din dator vanligtvis bara har en enda skärm för att visa grafik, måste din kod slå samman den grafik som den skapar till samma bild som används av Windows. Därför måste ett enda "grafik" -objekt delas. Det huvudsakliga sättet att din kod kan använda det "grafik" -objektet är att använda den parametern e som är överfördes till OnPaint-evenemanget med PaintEventArgs-objektet.

Protected Overrides Sub OnPaint (

 ByVal e As System. Windows. Former. PaintEventArgs)

 Dim g som grafik = e. Grafik

Andra exempel

Vad kan du göra mer med dessa parametrar? För att illustrera, antar du att du vill hitta om en sträng, kanske något du skrev in i en textbox, finns i någon av en samling andra textlådor när du klickar på en. Du kan koda ett par dussin praktiskt taget identiska underrutiner för varje textlåda:

Om TextBox42.Text. Index för(

 Search. Text) = -1 

 Sedan NotFound. Text = 

 "Hittades inte"

Men det är mycket lättare att koda bara en och låta den hantera dem alla. Avsändarparametern avslöjar vilken textlåda som klickades på.

Private Sub FindIt (

 ByVal avsändare som system. Objekt,

 ByVal e As System. EventArgs

 ) Hanterar TextBox1.Enter, 

 TextBox2.Enter, 

... och så vidare.. .

 TextBox42.Enter

 Dim myTextbox som textbox

myTextbox = avsändare

 Dim IndexChar som heltal = 

 myTextbox. Text. Index för( 

 Search. Text)

 Om IndexChar = -1 Sedan _

 Hittades inte. Text = "Inte hittat" _

 Annars _

 Hittades inte. Text = "Hittade det!"

 Avsluta under

Nyligen bad en programmerare mig om ett bättre sätt att "radera raden som klickades i någon av sex angivna listor." Han fick det att fungera i ett par dussin rader kod som helt enkelt förvirrade mig. Men med avsändaren var det egentligen ganska enkelt:

Privat underlistaBox_Click ( 

 ByVal avsändare som objekt, 

 ByVal e As System. EventArgs

 ) Hanterar ListBox1.Click, ListBox2.Click

 Dim myListBox som ny ListBox

 myListBox = avsändare

 MyListBox. Poster. Ta bortAt (myListBox. selected)

Avsluta under

Ett ytterligare exempel för att spikra ned poängen är en fråga som skickades in av Pierre i Belgien. Pierre testade likheten mellan knapp 1 och avsändare med hjälp av Är operatör för objekt:

Om avsändaren är knapp1 Då ...

Detta är syntaktiskt korrekt eftersom avsändare och knapp 1 är båda objekt som kan hänvisas till. Och eftersom avsändaren verkligen är identisk med Button1, varför fungerar det inte?

Svaret beror på ett nyckelord som finns lite tidigare i uttalandet. Låt oss först kontrollera Microsoft-dokumentationen för Är operatör.

Visual Basic jämför två objektreferensvariabler med Is Operator. Denna operatör avgör om två referensvariabler refererar till samma objektinstans.

Lägg märke till att avsändaren passeras ByVal. Det betyder att en kopia av knapp1 skickas, inte själva objektet. Så när Pierre testar för att se om avsändare och knapp 1 är samma instans är resultatet falskt.

För att testa om knapp 1 eller knapp 2 har klickats måste du göra avsändaren till ett verkligt knappobjekt och sedan testa en egenskap hos det objektet. Text används vanligtvis, men du kan testa ett värde i Tag eller till och med Location-egenskapen.

Den här koden fungerar:

Dim myButton As-knapp

myButton = avsändare

Om myButton. Text = "Knapp1" Sedan

instagram story viewer