Neem de volgende situatie:
We hebben een user control (ascx). Deze usercontrol heeft een public property en een public method. Hoe kunnen we deze code vanuit bijvoorbeeld een andere class aanroepen?
Code die publiek aangeroepen wordt binnen een applicatie moet in de App_Code directory staan. Een usercontrol mag daar weer niet staan.
Om dit op te lossen gaan we een stub inzetten. Een stub is feitelijk een class-definitie welke het kenmerk 'MustInherit' heeft en waarvan de public properties en methods als kernmerk 'MustOverride' hebben.
Deze stub zetten we in de App_Code directory en onze ascx laten we de stub 'inheriten'. Hierdoor fungeert de stub als een soort doorgeefluik en kunnen we de code vanuit onze applicatie aanroepen.
Voorbeeld:
Oude ASCX:
Code:
Partial Class dgEditor
Inherits System.Web.UI.UserControl
Private _DataGridId As String
Public Property DataGridId() As String
Get
Return _DataGridId
End Get
Set(ByVal value As String)
_DataGridId = value
End Set
End Property
Public Sub LoadData()
'Aanroepen code
End Sub
End Class
We laten de daadwerkelijke ascx-code even buiten beschouwing, die is nauwelijks relevant, alleen een beetje HTML. De hierboven getoonde code-behind is hetgeen van belang is.
De enige regel in de ascx zelf die wel belangrijk is is de eerste:
Code:
<%@ Control Language="VB" AutoEventWireup="false" CodeFile="dgEditor.ascx.vb" Inherits="dgEditor" ClassName="dgEditor" %><%@ Control Language="VB" AutoEventWireup="false" CodeFile="dgEditor.ascx.vb" Inherits="dgEditor" ClassName="dgEditor" %>
Je ziet dat bij 'Inherits' de dgEditor class staat zoals deze ook in de code-behind wordt gedefinieerd.
Nu gaan we deze code in tweeen splitsen, de stub-code (in App_Code) en de daadwerkelijke code (het huidige bestand zeg maar).
De stub-code:
Code:
Public MustInherit Class dgEditor
Inherits System.Web.UI.UserControl
Public MustOverride Property DataGridId() As String
Public MustOverride Sub LoadData()
End Class
Je ziet hier dus de class-name terugkomen met 'MustInherit', gevolgd door de inheritance van System.Web.UI.UserControl, net zoals we in de oude code zagen.
Vervolgens worden alle publieke elementen gedefinieerd met 'MustOverride'.
Nu de ascx-code-behind:
Code:
Partial Class _dgEditor
Inherits dgEditor
Private _DataGridId As String
Public Property DataGridId() As String
Get
Return _DataGridId
End Get
Set(ByVal value As String)
_DataGridId = value
End Set
End Property
Public Sub LoadData()
'Aanroepen code
End Sub
End Class
Grootste verschil met de oude code is de inheritance. In plaats van System.Web.Ui.UserControl erven we nu van dgEditor, onze stubclass.
In de ascx zelf veranderd de bovenste regel:
Code:
<%@ Control Language="VB" AutoEventWireup="false" CodeFile="dgEditor.ascx.vb" Inherits="_dgEditor" ClassName="dgEditor" %><%@ Control Language="VB" AutoEventWireup="false" CodeFile="dgEditor.ascx.vb" Inherits="_dgEditor" ClassName="dgEditor" %>
We erven nu de class _dgEditor (inderdaad, die uit de code-behind en dus niet vanuit de stub!)
Nu kunnen we de code aanroepen zoals we wilden.