我正在尝试创建一些包含一些现有控件的自定义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。这看起来像是一种合理的方式吗?
答案 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。