2014-05-01 11 views
0

첫 번째 서버 컨트롤을 작성하십시오. "null이 될 수 없습니다 매개 변수 이름 : 자식"내 코드에 표시된 지점에서 디버그 오류가 발생했습니다. 부모의 page_load 이벤트가 호출 될 때 텍스트 상자가 작성되고 아무 것도 표시되지 않습니다. page_load 이벤트는 내 컨트롤의 OnInit와 CreateChildControls 사이에서 발생합니다. 예를 들어보기가 어렵습니다.'값을 가져 오는 간단한 사용자 정의 서버 컨트롤은 null 일 수 없습니다. 매개 변수 이름 : 자식 '

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

좋아요, 어떻게 작동하는지 여기 있습니다.

기본적으로 OnInit 코드를 CreateChildControls ...로 이동합니다. 아래처럼 한 단계로 모든 컨트롤을 선언하고 추가하는 함수 (buildForm)를 만들었습니다.

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

측면 해설 : 사용자 지정 서버 컨트롤 대 웹 사용자 정의 컨트롤은 내가 비교하고 두 제어 실험 지난 4~5일 보냈다. 수년 동안 많은 사용자 컨트롤을 수행하고 응용 프로그램으로 복사했습니다. 생성 된 유지 보수를 싫어합니다.

저는 현재 웹 컨트롤을 서버 컨트롤과 같은 종류로 사용할 수있는 단일 DLL로 컴파일하려고 하루 종일 보냈습니다. 나는 그것이 지루하고 제한적이라는 것을 알았다.

MSDN을 비롯한 많은 기사에서 서버 컨트롤이 무서워서 웹 컨트롤을 만드는 것보다 훨씬 어려웠다 고합니다. 나는 말할 수있다 ... 지금까지 ... 나는 서버 컨트롤을 파고있다. 나는 이것을 처음부터 끝내기를 바란다. 진정한 재사용. 서버 컨트롤을 두려워하지 마십시오.

0

내가 전에도 해본 적이 없지만 맨 위에 말하면, DefaultValue (True); 그게 기본값을 가져야한다는 뜻인가요? 어쩌면 기본값 인 OnInit (또는 false로 설정)을 설정하면됩니다.

+0

나는 T | F와 아무 값도 시도했다. 디버그에서 텍스트 상자가 올바르게 생성 된 것을 볼 수 있습니다. 어떻게 든 그것은 CreateChildControls 이벤트가 발생할 때까지 (로컬 변수 임에도 불구하고) 삭제됩니다. – Ted