1

我有一个复杂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;
   }
}

ControlPametersGetter 通常在SqlDataSources具有此控件的页面上被调用。

二传手 - 来自标记:<uc:UserControl1 runat="server" ClientID='<%# Bind("ID") %>' />.

所以问题是:

为什么 setter fromBind被更早地调用PreRender呢?并且DropDownList是空的并且项目选择不起作用!如何解决此行为?

Edit1:好的,不是PreRender但是Init。但是 DropDownList1_DataBinding 在属性设置器之后仍然被调用!

4

1 回答 1

1

DataBinding 总是发生在PreRender. 来自ASP.Net 页面生命周期

DataBinding
此事件在包含控件(或 Page 对象)的 PreRender 事件之前由数据绑定控件引发,并标志着控件与数据绑定的开始。

如果需要,使用此事件手动打开数据库连接。(数据源控件通常不需要这样做。)

解决您的问题的一种方法是只处理DataBinding事件并预先绑定您的下拉列表(或者甚至只是在 期间进行Load),而不是一直等到PreRender. 这将确保DropDownListBind 调用关闭时可用。

另一种解决方案是只向您的控件传递对数据源本身的引用,而不是使用 Bind 调用。然后它可以在正确的时间以编程方式处理自己的绑定 - 您可以加载您的DropDownList,然后在所有期间PreRender通过访问数据源获取您的 ID。

于 2010-02-15T01:46:56.563 回答