我有一个复杂的UserControl
,其主要目的是将DropDownList
封装为一系列用于高级操作的属性。
正在PreRender
事件中填充列表,具体取决于之前设置的属性:
protected void Page_PreRender(object sender, EventArgs e)
{
sourceClient.SelectCommand = this.Property1 ? "exec a" : "exec b";
}
最常用的属性是ClientID:
[Category("Settings")]
public int ClientID
{
get
{
return Int32.Parse(DropDownList1.SelectedItem.Value);
}
set
{
DropDownList1.Items.FindByValue(value).Selected = true;
}
}
通过ControlPameters
SqlDataSources
在具有此控件的网页上调用getter。
Setter - 来自标记:<uc:UserControl1 runat="server" ClientID='<%# Bind("ID") %>' />
。
所以问题是:
为什么Bind
之前调用来自PreRender
的setter? DropDownList
为空,项目选择不起作用!如何解决此问题?
Edit1:好的,不是PreRender
而是Init
。但是在属性设置器之后仍然调用DropDownList1_DataBinding!
答案 0 :(得分:1)
DataBinding始终在PreRender
之前发生。来自ASP.Net Page Lifecycle:
DataBinding
此事件由提出 数据绑定控件之前 包含PreRender事件 控件(或Page对象)和 标志着绑定的开始 控制数据。使用此事件手动打开 数据库连接,如果需要。 (数据源控件经常制作 这是不必要的。)
您的问题的一个解决方案是只处理DataBinding
事件并预先绑定您的下拉列表(甚至只是在Load
期间执行此操作),而不是一直等到{{1} }}。这将确保在绑定呼叫关闭时PreRender
可用。
另一种解决方案是将控件传递给数据源本身,而不是使用Bind调用。然后它可以在适当的时间以编程方式处理绑定本身 - 您可以加载DropDownList
,然后通过访问数据源在DropDownList
期间获取您的ID。