假设我有这个用户控件
public class test : UserControl {
public int Count { get; set; }
public test() {
Count = 3;
}
public override DataBind() {
aRepeater.DataSource = dal.GetObjects(Count);
base.DataBind();
}
}
我在我的页面上使用它
<my:test runat="server" Count="<# something %>" />
我现在的问题是,在调用base.DataBind()之前,我无法在我的usercontrol中获取Count的值。我想它的数据绑定值本身。因此,解决方法就是
public override DataBind() {
base.DataBind(); // to bind values to self
aRepeater.DataSource = dal.GetObjects(Count);
base.DataBind(); // to bind new values that is dependent on the the first bind
}
它有效,但它似乎不对。我的问题是,最佳做法是针对这种情况。
答案 0 :(得分:1)
这是有道理的,因为Count="<# something %>"
发生在DataBind()
。我认为在这种情况下你应该处理DataBind()
处的所有数据绑定(而不是使用页面绑定方法)。当然,这只是美化代码的问题 - 仅此而已。
答案 1 :(得分:1)
只需覆盖OnDataBinding方法,而不是DataBind:
protected override void OnDataBinding(EventArgs e) {
base.OnDataBinding(e);
aRepeater.DataSource = dal.GetObjects(Count);
}
DataBind方法基本上包括两个步骤:1)OnDataBinding(),2)每个子控件的DataBind()。
答案 2 :(得分:0)
您是否必须在.ascx文件中设置用户控件的Count属性?如何完全没有Count属性或在包含用户控件的页面后面的代码中设置Count?
<my:test runat="server" id="test1" />
代码背后:
//User control code behind. GetCount() returns an int.
public override DataBind() {
aRepeater.DataSource = dal.GetObjects(GetCount());
base.DataBind();
}
或
//Page that has the user control.
protected void Page_Load(object sender, EventArgs e)
{
this.test1.Count = 5;
}
//User control code behind.
public override DataBind()
{
aRepeater.DataSource = dal.GetObjects(this.Count);
base.DataBind();
}