简单的自定义服务器控件获取'值不能为空。参数名称:child'

时间:2014-05-01 05:52:35

标签: asp.net custom-server-controls servercontrols

构建我的第一个服务器控件。在我的代码中指示的点调试中获取“值不能为null。参数名称:子”错误。创建文本框,然后在调用父级的page_load事件时变为空。 page_load事件在我的控件中的OnInit和CreateChildControl之间触发。例子很难得到。

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

2 个答案:

答案 0 :(得分:0)

我之前没有这样做,但在顶部你说,DefaultValue(True);这是否意味着它必须具有默认值?也许你设置一个默认值OnInit(或使prop为false)。

答案 1 :(得分:0)

好的,这就是我如何运作的。

我基本上将OnInit代码移动到CreateChildControls ... duh! 我创建了一个函数(buildForm),它在一个步骤中声明并添加所有控件,如下所示。

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

SIDEBAR:网络用户控制与自定义服务器控制 我花了最后4-5天比较并试验了两种对照。多年来,我做了很多用户控件,并将它们复制到应用程序中。讨厌创造的维护。

我花了一整天的时间尝试将我当前的Web控件编译成单个dll,可以像服务器控件一样使用。我发现它很乏味且有限。

许多文章,包括MSDN,让我害怕服务器控件说它比创建Web控件要难得多。我可以说......到目前为止......我正在挖掘服务器控件。我希望我在一开始就这样做了。真正的重用。不要害怕服务器控制。