2014-05-01 5 views
0

Construction de mon premier contrôle serveur. Obtenir l'erreur "Valeur ne peut pas être null. Nom du paramètre: enfant" dans le débogage au point indiqué dans mon code. La zone de texte est créée, puis ne devient rien lorsque l'événement page_load du parent est appelé. L'événement page_load se déclenche entre OnInit et CreateChildControls dans mon contrôle. Les exemples sont difficiles à trouver.Le contrôle de serveur personnalisé simple obtient 'La valeur ne peut pas être nulle. Nom du paramètre: enfant '

Public Class ContactForm 
Inherits WebControl 

#Region "Local variables" 
Private _ShowFirstName As Boolean 
Private tbFirstName As TextBox 
#End Region 


<Browsable(True), _ 
Bindable(True), _ 
Category("Appearance"), _ 
DefaultValue(True), _ 
Localizable(True), _ 
Description("Show First Name field")> _ 
Public Property ShowFirstName() As Boolean 
    Get 
     Return _ShowFirstName 
    End Get 
    Set(value As Boolean) 
     _ShowFirstName = value 
    End Set 
End Property 

Protected Overrides Sub OnInit(e As EventArgs) 
    If ShowFirstName = True Then 
     Dim tbFirstName As New TextBox 
     tbFirstName.ID = "tbFirstName" 
     tbFirstName.MaxLength = 30 
     tbFirstName.Text = "IM HERE" 
    End If 
    MyBase.OnInit(e) 

End Sub 

<<<<< --- NOTE: The Page_Load event of the parent fires here ->>>>> 

Protected Overrides Sub CreateChildControls() 
    Me.Controls.Add(tbFirstName) <<---Error: Value cannot be null. Parameter name: child 
    If HasChildViewState Then 
     ClearChildViewState() 
    End If 
    MyBase.CreateChildControls() 
End Sub 

End Class 

Répondre

0

Bon, voici comment je l'ai fonctionné.

Je déplace fondamentalement le code OnInit dans le CreateChildControls ... duh! J'ai créé une fonction (buildForm) qui déclare et ajoute tous les contrôles dans une étape comme ci-dessous.

Protected Overrides Sub CreateChildControls() 
    buildForm() 
    If HasChildViewState Then 
     ClearChildViewState() 
    End If 
    MyBase.CreateChildControls() 
End Sub 

SIDEBAR: contrôle utilisateur Web vs contrôle serveur personnalisé J'ai passé les 4-5 derniers jours comparer et expérimenter avec les deux commandes. J'ai fait beaucoup de contrôles utilisateur au cours des années et les ai simplement copiés dans des applications. Détesté la maintenance qui a créé.

J'ai passé une journée entière à essayer de compiler mes contrôles Web actuels en une seule DLL qui pourrait être utilisée comme des commandes serveur. Je l'ai trouvé fastidieux et limité.

De nombreux articles, y compris MSDN, m'avaient fait peur des contrôles du serveur en disant qu'il est beaucoup plus difficile à créer qu'un contrôle Web. Je peux dire ... jusqu'à présent ... Je suis en train de creuser le contrôle du serveur. J'aurais aimé faire cela au début. Vraie réutilisation. Ne craignez pas le contrôle du serveur.

0

Je n'ai pas fait cela avant mais en haut vous dites, DefaultValue (True); cela signifie-t-il qu'il doit avoir une valeur par défaut? peut-être si vous définissez une valeur par défaut OnInit (ou faites le prop false).

+0

J'ai essayé T | F et aucune valeur. En débogage, je peux voir que la zone de texte est créée correctement. D'une certaine manière, il est supprimé (même si c'est une variable locale) au moment où l'événement CreateChildControls se déclenche. – Ted

Questions connexes