在DataBind上选择封装的DropDownList中的项目

时间:2010-02-15 00:57:23

标签: .net asp.net user-controls page-lifecycle

我有一个复杂的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!

1 个答案:

答案 0 :(得分:1)

DataBinding始终在PreRender之前发生。来自ASP.Net Page Lifecycle

  

DataBinding
  此事件由提出   数据绑定控件之前   包含PreRender事件   控件(或Page对象)和   标志着绑定的开始   控制数据。

     

使用此事件手动打开   数据库连接,如果需要。   (数据源控件经常制作   这是不必要的。)

您的问题的一个解决方案是只处理DataBinding事件并预先绑定您的下拉列表(甚至只是在Load期间执行此操作),而不是一直等到{{1} }}。这将确保在绑定呼叫关闭时PreRender可用。

另一种解决方案是将控件传递给数据源本身,而不是使用Bind调用。然后它可以在适当的时间以编程方式处理绑定本身 - 您可以加载DropDownList,然后通过访问数据源在DropDownList期间获取您的ID。