构建我的第一个服务器控件。在我的代码中指示的点调试中获取“值不能为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
答案 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控件要难得多。我可以说......到目前为止......我正在挖掘服务器控件。我希望我在一开始就这样做了。真正的重用。不要害怕服务器控制。