2010-12-14 6 views
1

まず初期化しませんユーザー名、パスワード、送信ボタンの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

目標は、コントロールを使用してASPXマークアップのプロパティを設定することができるようになったのに役立ちます。ただし、プロパティは初期化されませんでした。

私の誤差が(CreateChildControlsのを使用しての理解にあった)とRenderChildren(..) 私はそれがどちらか一方を使用していたと思いました。代わりに、私はすべての子コントロールをインスタンス化し、CreateChildControls()でそれらを追加します。

プロパティをロードするために、私はOnPreRender()イベントまで待機します。コントロールはすべてロードされ、データもロードされます。次に、コントロールがページにレンダリングされる前に、最終的な変更を行います。

もう少し控えて、表示用にコントロールに囲まれた既定のタグを変更したいと思っていました(ASPはデフォルトでスパンで囲みます)。したがって、ブロックレベルのelemが必要な場合は、問題が発生します。 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

。私はすでに解決策を考案しました。このような問題に対処するには、通常、いくつかの方法以上のものがあるようです。私は主に、この問題を、学習プロセス中に実行される可能性のあるフォーマットやフレーズが不適切なため再フォーマットしました。 –

関連する問題