【问题标题】:Simple Custom Server Control getting 'Value cannot be null. Parameter name: child'获取“值不能为空”的简单自定义服务器控件。参数名称:child'
【发布时间】:2014-05-03 06:24:04
【问题描述】:

构建我的第一个服务器控件。在我的代码中指示的点调试中获取“值不能为空。参数名称:子”错误。文本框被创建,然后在调用父级的 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

【问题讨论】:

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


    【解决方案1】:

    我以前没有这样做过,但在顶部你说的是 DefaultValue(True);这是否意味着它必须具有默认值?也许如果您设置默认值 OnInit (或使道具为假)。

    【讨论】:

    • 我尝试了 T|F 并且没有任何价值。在调试中,我可以看到文本框已正确创建。在 CreateChildControls 事件触发时,它以某种方式被删除(即使它是一个局部变量)。
    【解决方案2】:

    好的,这就是我的工作方式。

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

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

    边栏:Web 用户控制与自定义服务器控制 在过去的 4-5 天里,我对这两种控制进行了比较和试验。这些年来,我做了很多用户控件,只是将它们复制到应用程序中。讨厌创建的维护。

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

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

    【讨论】:

      猜你喜欢
      • 2011-03-24
      • 2020-04-21
      • 2019-02-27
      • 1970-01-01
      • 1970-01-01
      • 2014-07-13
      • 2020-02-13
      • 1970-01-01
      相关资源
      最近更新 更多