Listbox subclass handles events (Part 1)
Deze tutiorial geeft de ontwikkelaar inzicht in het subclassen van een control om events te kunnen onderscheppen. Het doel hiervan is om extra acties uit te kunnen voeren, voordat het event wordt doorgestuurd naar de control zelf. Als voorbeeld wordt er gebruik gemaakt van een listbox control.
Om de code te creëren voeren we de volgende stappen uit:
- Open Visual Studio.NET.
- Start een nieuw VB Windows Application project.
- Geef het project een willekeurige naam.
- Het project opent met een leeg form.
- Sleep uit de toolbox een listbox control op het form.
- In mijn voorbeeld (zie code uit de zip file) heb ik de volgende items toegevoegd aan de collection-property van de listbox, maar je kunt uiteraard invullen wat je zelf wil:
- VB.NET - C# - ASP.NET - Java - FoxPro - VO - Delphi
- Open de Code View voor form1 door te dubbelklikken op het form of door via de rechtermuisknop de Code View te openen.
- Expand de region Windows Form Designer generated code door te klikken op het + teken ervoor.
- Open met Ctrl+F het Search and Replace venster en voer de volgende acties uit:
- Search for ListBox - Klik op de Replace button - Replace with SDGNListBox - Opties Match Case, Match Whole uitzetten - Optie Search Hidden Text aanzetten - Zoek Current Document - Klik op Replace All
- Sluit het Search and Replace venster
- Zoek in de region Windows Form Designer generated code naar de volgende regel:
Friend WithEvents SDGNListBox1 As System.Windows.Forms.SDGNListBox
- Deze regel toont een fout, wat te zien is aan het geribbelde lijntje onder System.Windows.Forms.SDGNListBox. Dit komt omdat SDGNListbox geen member is van het System.Windows.Forms object.
- Pas de regel als volgt aan:
Friend WithEvents SDGNListBox1 As SDGNListBox
- Het geribbelde lijntje zal nog niet verdwenen zijn. Dit komt omdat de assembly waar deze declaratie in staat, nog niet gecompileerd is.
- Een paar regels verder naar beneden vind je het volgende statement:
Me.SDGNListBox1 = New System.Forms.SDGNListBox()
- Verander deze regel in:
Me.SDGNListBox1 = New SDGNListBox()
- Ook hier blijft het geribbelde lijntje staan om dezelfde reden van de nog niet gecompileerde assembly.
- Open de Designer View van het scherm door te klikken op design tab of door gebruik te maken van het rechtermuisknop menu. Let op: de listbox control zal van het scherm verdwenen zijn!
- Voeg een nieuwe class declaratie toe aan het project. Zorg ervoor dat deze wordt toegevoegd buiten de Public class Form1 declaration!
Public Class SDGNListBox
Inherits System.Windows.Forms.ListBox
Public Shadows Event Click( _ ByVal sender As Object, _ ByVal evArg As EventArgs, _ ByVal i As Integer)
Public Shadows Event Resize( _ ByVal sender As Object, _ ByVal evArg As EventArgs, _ ByVal i As Integer)
Private WithEvents mListBox As System.Windows.Forms.ListBox
Public Sub New() MyBase.New() mListBox = Me End Sub
Private Sub mListBox_Click( _ ByVal sender As Object, _ ByVal evArg As System.EventArgs) _ Handles mListBox.Click
MsgBox("Click event captured.") RaiseEvent Click(sender, evArg, 1) End Sub
Private Sub mListBox_Resize( _ ByVal sender As Object, _ ByVal evArg As System.EventArgs) _ Handles mListBox.Resize
RaiseEvent Resize(sender, evArg, 1)
End Sub End Class
- Open de Designer View. Je krijgt nu twee foutmeldingen, omdat de assembly waarin de declaraties staan nog niet gecompileerd is.
- Rebuild de solution.
- De listbox laat zich nog steeds niet zien na deze acties?
- Sluit het form af.
- Heropen het scherm en de listbox is nu weer zichtbaar
- De listbox is gesubclassed.
Om e.e.a. te testen doen we het volgende:
- Run het form (Ctrl+F5)
- Klik op één van de items in de listbox.
- Het event wordt afgevangen en de messagbox wordt getoond, voordat het event wordt doorgestuurd naar het control zelf.
Het resultaat zou er als volgt uit moeten zien:

Download code
Please stay tuned to www.sdgn.nl to read part 2 of this article!
|
|
|