2011-02-02 5 views
1

와 사용자 정의 DropDownList로 : 나는 이름 충돌을 피하기 싶었 기 때문에내가 DropDownList로에서 상속 사용자 지정 컨트롤을 만들어 DropDownList로에 대한 검증 지원을 추가하기 위해 노력하고있어 검증

public class MyDropDown: DropDownList, INamingContainer 
{ 
    private const string ValidatorID = "Validator"; 
    private RequiredFieldValidator _validator; 

    protected override ControlCollection CreateControlCollection() 
    { 
     return new ControlCollection(this); 
    } 

    protected override void CreateChildControls() 
    { 
     base.CreateChildControls(); 
     Controls.Clear(); 

     _validator = new RequiredFieldValidator 
     { 
      ID = String.Format("{0}_{1}", ID, ValidatorID), 
      ControlToValidate = ID, 
      InitialValue = String.Empty, 
      ErrorMessage = "*", 
      ForeColor = Color.Red 
     }; 

     Controls.Add(_validator); 
    } 

    protected override void Render(HtmlTextWriter writer) 
    { 
     base.Render(writer); 
     _validator.RenderControl(writer); 
    } 
} 

내 클래스는 하는 INamingContainer을 구현합니다. 불행하게도 나는 다음과 같은 예외가이 컨트롤을 사용하려고하면

의 'ControlToValidate'속성에 의해 참조 제어 ID 'MDD'을 (를) 찾을 수 없습니다 'MDD_Validator'

이가 beause 일어나고있다 INamingContainer FindControl (NamingContainerId)은 null을 반환합니다.

나는 다음과 같은 방법으로 하는 INamingContainer 구현 및 설정 유효성 검사기 ID를 제거하면 :

_validator.ID = String.Format("{0}_{1}", ID, ValidatorID); 

모든 것이 잘 작동하고 컨테이너 명명 안에 있어야하는 것처럼 검사기에 지정된 ID가 동일합니다.

그러나이 작업을 수행하는 방법이 있습니까 WITH INamingContainer?

+0

유효성을 검사 할 컨트롤을 설정할 때 ID'가'this.ClientID'를 사용하는 대신'의 ... – bleepzter

+0

그것은 찾을 수 없습니다 여전히 컨트롤을 도움이되지 않았다, 단지이 시간이 된 ClientID 오류 메시지가 ID 대신 – trickst3r

답변

1

드롭 다운 컨트롤 안에 유효성 검사기가 있습니다. 유효성 검사기가 작동하려면 유효성 검사를 수행 할 컨트롤과 동일한 컨테이너에 있어야합니다. 당신이해야 할 일은 DropDownList가 RequiredFieldValidator와 같은 컨테이너에 있도록 클래스를 다시 정의하는 것입니다. 나는 다음과 같이 할 것이다 :

public class MyDropDown: WebControl, INamingContainer 
{ 
    private DropDownList _dropDown; 
    private RequiredFieldValidator _validator; 

    protected override void CreateChildControls() 
    { 
     base.CreateChildControls(); 
     Controls.Clear(); 

     _dropDown = new DropDownList(); 
     _dropDown.ID = ID + "_ddl"; 
     Controls.Add(_dropDown); 

     _validator = new RequiredFieldValidator(); 
     _validator.ID = ID + "_Validator"; 
     _validator.ControlToValidate = _dropDown.ClientID; 
     _validator.InitialValue = String.Empty; 
     _validator.ErrorMessage = "*"; 
     _validator.ForeColor = Color.Red; 
     Controls.Add(_validator); 
    } 

    //etc. 
} 

정보는 여기에있다.
http://msdn.microsoft.com/en-us/library/system.web.ui.webcontrols.basevalidator.controltovalidate.aspx