我想创建一个用户控件,功能类似于TextBox,但多给了一个默认值
方法一:直接继承TextBox
Code
public class NameInput01 : TextBox
{
[Bindable(true)]
[Category("Appearance")]
[DefaultValue("")]
[Localizable(true)]
public string Value
{
get
{
object viewState = ViewState["Value"];
return ((viewState == null) ? "" : (string)viewState);
}
set
{
ViewState["Value"] = value;
}
}
protected override void OnInit(EventArgs e)
{
base.OnInit(e);
this.Text = (String.IsNullOrEmpty(this.Value)) ? "ENTER YOUR NAME" : this.Value;
}
}
但这样在应用的时候不能被绑定,如:
<bse:NameInput01 ID="nameInput01" runat="server" Value=“BURNING” />
结果是 BURNING
<bse:NameInput01 ID="nameInput01" runat="server" Value='<%# Bind("Name") %>' />
结果是 ENTER YOU NAME (控件中的默认值)
于是我又尝试了方法二:继承CompositeControl
Code
public class NameInput02 : CompositeControl
{
[Bindable(true)]
[Category("Appearance")]
[DefaultValue("")]
[Localizable(true)]
private TextBox textBox;
public string Value
{
get
{
object viewState = ViewState["Value"];
return ((viewState == null) ? "" : (string)viewState);
}
set
{
ViewState["Value"] = value;
}
}
protected override void CreateChildControls()
{
Controls.Clear();
textBox = new TextBox();
textBox.Text = (String.IsNullOrEmpty(this.Value)) ? "ENTER YOUR NAME" : this.Value;
Controls.Add(textBox);
ChildControlsCreated = true;
}
}
这样虽然在应用的时候能被绑定了,但却失去了TextBox本身的一些方法和属性例如 ForeColor OnTextChanged之类的都不起作用了。
因为这是一个组合控件,它当然不会有 TextBox 放进来用而已,当然不会有 TextBox 的属性和方法。
不过可以通过给组件添加属性,然后把它复制给子控件,但事件就不知道怎么处理了。
我的一问是,第一种方法原本应该顺利成章,但为什么却不能动态绑定了?
不知道有没有更好的解决方法
(我实在没分了 -_-! )
我对你的"代码一"改了下,看看是你想要的不
关于OnInit事件,没做处理.测试过可以绑定数据
Code
222
因为
<bse:NameInput01 ID="nameInput01" runat="server" Value=“BURNING” />在控件初始化时就进行了赋值
<bse:NameInput01 ID="nameInput01" runat="server" Value='<%# Bind("Name") %>' />必需要在控件调用DataBind()方法以后才有效。
你检查一下看看执行顺序问题