[英]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.