2010-02-15 63 views
1

我有一個複雜的UserControl,主要目的是封裝DropDownList與一些屬性進行高級操作。在DataBind上的封裝DropDownList中選擇項目

列表被填充上PreRender事件取決於先前已設置的屬性:

protected void Page_PreRender(object sender, EventArgs e) 
{ 
    sourceClient.SelectCommand = this.Property1 ? "exec a" : "exec b"; 
} 

最常用的屬性是客戶端ID:

[Category("Settings")] 
public int ClientID 
{ 
    get 
    { 
     return Int32.Parse(DropDownList1.SelectedItem.Value); 
    } 
    set 
    { 
     DropDownList1.Items.FindByValue(value).Selected = true; 
    } 
} 

吸氣劑通常被在SqlDataSources呼籲通過ControlPameters上頁與此控制。

二傳手 - 從標記:<uc:UserControl1 runat="server" ClientID='<%# Bind("ID") %>' />

所以,問題是:

爲什麼從Bind二傳手早叫然後PreRender?而且DropDownList是空的,並且項目選擇不起作用!如何解決此問題?

編輯1:好吧,不是PreRender而是Init。但DropDownList1_DataBinding仍然在屬性設置器之後被調用!

回答

1

DataBinding始終發生在PreRender之前。從ASP.Net Page Lifecycle

數據綁定
此事件由 數據綁定控件含 控制的 PreRender事件之前引發(或Page對象)和 標記的結合 控制到開始數據。

如果需要,請使用此事件手動打開 數據庫連接。 (數據源控件往往使 這是不必要的。)

一個解決方案是你的問題是隻處理DataBinding事件和預先綁定的下拉列表(或在Load甚至只是做了),而不是一直等到PreRender。這將確保在綁定呼叫關閉時DropDownList可用。

另一種解決方案是將您的控件引用到數據源本身,而不是使用綁定調用。然後,它可以通過編程方式在合適的時間處理綁定 - 您可以通過訪問數據源來加載DropDownList,然後在PreRender期間獲取您的ID。

+0

@womp:嗨,謝謝你的提示!我重寫了我的代碼,所以現在我有了Page_DataBinding事件處理程序,但仍然首先在它的屬性設置器之後調用Page_DataBinding,並且在它之後從它的數據源填充它的DropDownList1_DataBinding。如何在setter之前將數據綁定到下拉列表中? – abatishchev 2010-02-15 01:55:44

相關問題