2010-12-14 3 views
1

를 초기화하지 첫 번째 - LblTextBox : 레이블 텍스트사용자 정의 컨트롤 속성이 제대로

을 변경 설정할 수있는 LabelText 필드가 레이블 및 텍스트 상자 두 번째 - LoginCtl : 두 인스턴스를 가진 로그인 컨트롤 사용자 이름, 암호 및 제출 단추에 대한 LblTextBox의 설명

작업을 완료하기 위해 CreateChildControls()를 재정의하지 않으므로 서식 지정을 위해 이러한 컨트롤의 태그 렌더링을 제어하려고합니다.

내 문제는 컨트롤이 렌더링되지만 두 컨트롤의 OnInit() 코드 중 아무 것도 보류하지 않습니다 (빈 레이블, CSS 스타일이 적용되지 않음 등).

모든 방향이 좋습니다!

public class LblTextBox : CompositeControl 
{ 
    public string LabelText { get; set; } 
    public string Text { get; set; } 

    TextBox input; 
    Label label; 
    RequiredFieldValidator evalReqField; 

    public LblTextBox() 
    { 
     label = new Label(); 
     input = new TextBox(); 
     evalReqField = new RequiredFieldValidator(); 
    } 

    protected override void OnInit(EventArgs e) 
    { 
     label.ID = "lblTextBox"; 
     label.Text = string.Format("{0}:", LabelText); 

     input.ID = "tbInput"; 

     evalReqField.ID = "evalInput"; 
     evalReqField.ControlToValidate = input.ID; 
     evalReqField.ErrorMessage = "(Required)"; 
     evalReqField.Display = ValidatorDisplay.Dynamic; 
    } 

    protected override void RenderChildren(HtmlTextWriter writer) 
    { 
     writer.RenderBeginTag(HtmlTextWriterTag.Div); 
     label.RenderControl(writer); 
     input.RenderControl(writer); 
     evalReqField.RenderControl(writer); 
     writer.RenderEndTag(); 
    } 
} 

public class LoginCtl : CompositeControl 
{ 
    public string UserName 
    { 
     get 
     { 
      return (ltbUser != null) ? ltbUser.Text : string.Empty; 
     } 
     set 
     { 
      if (ltbUser != null) 
       ltbUser.Text = value; 
     } 
    } 

    public string Password 
    { 
     get 
     { 
      return (ltbPass != null) ? ltbPass.Text : string.Empty; 
     } 
     set 
     { 
      if (ltbPass != null) 
       ltbPass.Text = value; 
     } 
    } 

    private LblTextBox ltbUser; 
    private LblTextBox ltbPass; 
    private Button btnSubmit; 

    public LoginCtl() 
    { 
     ltbUser = new LblTextBox(); 
     ltbPass = new LblTextBox(); 
     btnSubmit = new Button(); 
    } 

    protected override void OnInit(EventArgs e) 
    { 
     ltbUser.LabelText = "User Name"; 
     ltbPass.LabelText = "Password"; 
     btnSubmit.Text = "Submit"; 
     btnSubmit.CssClass = "Submit"; 
    } 

    protected override void RenderChildren(HtmlTextWriter writer) 
    { 
     writer.AddAttribute(HtmlTextWriterAttribute.Class, "LoginCtlDiv"); 
     writer.RenderBeginTag(HtmlTextWriterTag.Div); 
     ltbUser.RenderControl(writer); 
     ltbPass.RenderControl(writer); 
     btnSubmit.RenderControl(writer); 
     writer.RenderEndTag(); 
    } 
} 

답변

1

하는 데 도움이됩니다. 그러나 속성은 초기화되지 않았습니다.

CreateChildControls() 및 RenderChildren (..) 사용에 대한 이해에서 오류가 발생했습니다. 나는 둘 중 하나를 사용하는 것으로 생각했습니다. 대신 모든 자식 컨트롤을 인스턴스화하고 CreateChildControls()에 추가합니다.

속성을로드하기 위해 OnPreRender() 이벤트가 발생할 때까지 대기합니다. 컨트롤이 모두로드되고 데이터도로드됩니다. 그런 다음 컨트롤이 페이지에 렌더링되기 전에 마지막으로 변경합니다.

또 다른 작은 메모는 표시 목적으로 내 컨트롤을 감싸는 기본 태그를 변경하고 싶다는 것입니다. ASP는 기본적으로 범위로 줄 바꿈합니다. 그래서 블록 레벨을 원한다면 문제가 발생할 것입니다. TagKey 속성을 재정 의하여 enum elem으로 설정하면 기본 span 태그 대신 해당 태그가 사용됩니다.

나는 다음으로 구조 조정이 잘 작동 할 수

public class LblTextBox : CompositeControl 
{ 
    protected override void OnPreRender(EventArgs e) 
    { 
     label.Text = string.Format("{0}:", LabelText); 
     base.OnPreRender(e); 
    } 

    protected override HtmlTextWriterTag TagKey 
    { 
     get 
     { 
      return HtmlTextWriterTag.Div; 
     } 
    } 

    protected override void CreateChildControls() 
    { 
     label = new Label(); 
     input = new TextBox(); 
     evalReqField = new RequiredFieldValidator(); 

     label.ID = "lblTextBox"; 
     input.ID = "tbInput"; 
     evalReqField.ID = "evalInput"; 

     evalReqField.ControlToValidate = input.ID; 
     evalReqField.ErrorMessage = "(Required)"; 
     evalReqField.Display = ValidatorDisplay.Dynamic; 

     Controls.Add(label); 
     Controls.Add(input); 
     Controls.Add(evalReqField); 
     base.CreateChildControls(); 
    } 

    public string LabelText { get; set; } //label text 
    public string Text { get; set; } //text in textbox 

    TextBox input; 
    Label label; 
    RequiredFieldValidator evalReqField; 
} 


public class LoginCtl : CompositeControl 
{ 
    protected override void CreateChildControls() 
    { 
     ltbUser = new LblTextBox(); 
     ltbPass = new LblTextBox(); 
     btnSubmit = new Button(); 

     ltbUser.LabelText = "User Name"; 
     ltbPass.LabelText = "Password"; 
     ltbPass.MargBetween = "10px"; 
     btnSubmit.Text = "Submit"; 
     btnSubmit.CssClass = "Submit"; 

     Controls.Add(ltbUser); 
     Controls.Add(ltbPass); 
     Controls.Add(btnSubmit); 
    } 

    //.. 
    //.. 

    private LblTextBox ltbUser; 
    private LblTextBox ltbPass; 
    private Button btnSubmit; 

    protected override HtmlTextWriterTag TagKey 
    { 
     get 
     { 
      return HtmlTextWriterTag.Div; 
     } 
    } 
} 
0

기억하지 않는 이유 (내 기억하려고합니다),하지만 난 몇 달 전에 매우 비슷한 문제가 있고, 내 솔루션은 onLoad 이벤트 핸들러에서 "ID"의 제외하고 모든 속성을 초기화하는 것이 었습니다 :

protected override void OnLoad(EventArgs e) 
{ 
     label.Text = string.Format("{0}:", LabelText); 
     evalReqField.ControlToValidate = input.ID; 
     evalReqField.ErrorMessage = "(Required)"; 
     evalReqField.Display = ValidatorDisplay.Dynamic; 

} 

희망이 목표는 컨트롤을 사용하여 영문 마크 업의 속성을 설정할 수 있도록했다

+0

. 나는 이미 해결책을 고안했다. 일반적으로이 문제를 다루는 데는 여러 가지 방법이 있습니다. 주로이 질문을 형식을 바꾸었고 학습 과정에서이 문제로 인해 실행될 수있는 문구가 있기 때문에 주로이 문제를 다시 형식화했습니다. –

관련 문제