[英]Simple Custom Server Control getting 'Value cannot be null. Parameter name: child'
構建我的第一個服務器控件。 在代碼中指示的點上,在調試中獲取“值不能為空。參數名稱:child”錯誤。 文本框已創建,然后在調用父級的page_load事件時變為空。 page_load事件在控件中的OnInit和CreateChildControls之間觸發。 例子很難得到。
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
我以前沒有做過,但最上面您說的是DefaultValue(True); 這是否意味着它必須具有默認值? 也許如果您將默認值設置為OnInit(或將prop設置為false)。
好的,這就是我的工作方式。
我基本上將OnInit代碼移到CreateChildControls ... duh中! 我創建了一個函數(buildForm),該函數在一個步驟中聲明並添加所有控件,如下所示。
Protected Overrides Sub CreateChildControls()
buildForm()
If HasChildViewState Then
ClearChildViewState()
End If
MyBase.CreateChildControls()
End Sub
SIDEBAR:Web用戶控件與自定義服務器控件在過去的4-5天中,我比較並試驗了這兩個控件。 這些年來,我做了很多用戶控制,只是將它們復制到了應用程序中。 討厭創建的維護。
我花了一整天的時間試圖將當前的Web控件編譯成單個dll,可以像服務器控件那樣使用它。 我發現這很乏味且有限。
包括MSDN在內的許多文章都讓我害怕服務器控件,因為它比Web控件更難創建。 我可以說...到目前為止,我正在研究服務器控件。 我希望我一開始就這樣做。 真正的重用。 不要擔心服務器控制。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.