自定义WebControl和回发

时间:2011-02-28 09:17:11

标签: asp.net web-controls

我正在尝试创建一些包含一些现有控件的自定义Web控件。例如,其中一个是文本框的包装(因为我需要其他行为,例如相应的验证器)。问题是,我不知道如何在回发中获取该控件的数据。

一个非常简单的例子:

public class MyTestBox: WebControl
{
protected TB { get; set; }
public Text
{
    get { return TB.Text; }
    set { TB.Text = value; }
}
protected override void CreateChildControls()
{
TB= new TextBox()
Controls.Add(TB);
}
}

但是如果我现在用控件测试一个webform:

<asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>
<bleh:MyTextBox ID="MyTextBox1" runat="server" />
<asp:Button ID="Button1" runat="server" Text="Submit" />

然后在文本框中输入文本并提交后,TextBox1中的文本在Page_Load中可用,而MyTextBox1.Text为空。发送回发时,我应该更改哪些内容可用?

编辑:

我现在想到的是在初始化控件时简单地检查请求表单:

protected override void OnInit(EventArgs e)
{
    TB.ID = this.ID + "_TextBox1";
    Controls.Add(TB);
    if (Page.Request.Form[TB.UniqueID] != null)
    {
         Text = Page.Request.Form[TB.UniqueID];
    }
}

它似乎工作,但感觉有点hacky。这看起来像是一种合理的方式吗?

3 个答案:

答案 0 :(得分:0)

你应该给动态生成的TextBox一个ID,然后在你的控件的Text属性上,你应该找到TextBox并返回它的Text。

public class BksTextBox: WebControl
{
protected TB { get; set; }
public Text
{
    get 
    { 
       return ((TextBox)this.FindControl("txt")).Text;
    }
}
protected override void CreateChildControls()
{
TB= new TextBox()
TB.ID = "txt";
Controls.Add(TB);
}
}

答案 1 :(得分:0)

我没有得到你的问题。 如果您需要向Web控件添加一些额外的行为,那么您应该执行与您希望扩展类继承的行为相同的操作。 您可以从TextBox类继承直接并添加所需的所有额外行为

 public class BksTextBox: TextBox
  {
    //it is just as example
    public string TextToUpperCase
    {
    get
      {
       return Text.ToUpperCase();
       }
     }

}

答案 2 :(得分:0)

它可能与页面生命周期有关。尝试在Text属性getter中使用this.EnsureChildControls()。有关页面生命周期的更多信息,请参阅MSDN documentation