2010-02-17 51 views
4

我在代碼隱藏中生成下拉列表,無法讓selectedindexchanged事件自動觸發。當直接放入ASPX頁面時它工作正常,但我需要它在代碼隱藏中。ASP.NET下拉列表Codebehind vs ASPX頁面

這不起作用:

var deptList = new DropDownList 
    { 
     ID = "deptList", 
     DataSource = departments, 
     DataTextField = "deptname", 
     DataValueField = "deptid", 
     AutoPostBack = true, 
     EnableViewState = true 
    }; 

deptList.SelectedIndexChanged += new EventHandler(deptList_SelectedIndexChanged); 
deptList.DataSource = departments; 
deptList.DataTextField = "deptname"; 
deptList.DataValueField = "deptid"; 

if (!IsPostBack) 
    deptList.DataBind(); 

deptList.Items.Insert(0, new ListItem("---Select Department---", string.Empty)); 

writer.Write("Select a department: "); 
deptList.RenderControl(writer); 

但這個工程:

<asp:DropDownList ID="deptList" AutoPostBack="true" runat="server" OnSelectedIndexChanged="deptList_SelectedIndexChanged"></asp:DropDownList> 

回答

6

的問題可能是,如果你不加控制頁面夠早。需要在頁面生命週期的早期階段添加控件以獲取事件綁定。

您可能在Load事件中執行此操作,這太遲了。嘗試在Init事件中添加它或覆蓋CreateChildControls方法。

編輯:正如Dave Swersky提到的,確保您在每頁請求上都做這件事,包括回傳。

+0

因此,因爲我將它呈現給HTMLTexWriter,我會將它呈現給Init還是Load? – Alex 2010-02-17 16:52:44

+0

我把整個代碼塊放到page_init中,並且什麼也沒有發生 – Alex 2010-02-17 17:39:27

+0

比較Firebug或IE開發控制檯中工作實現(標記)和非工作(代碼)之間的標記。有些不同。 – 2010-02-17 20:34:58

2

您的代碼中有一個網格。嘗試去創建,數據綁定和事件調用。

例子:

<asp:DropDownList ID="deptList" AutoPostBack="true" runat="server"></asp:DropDownList> 

然後在後面的代碼(的Page_Load):

deptList.SelectedIndexChanged += new EventHandler(deptList_SelectedIndexChanged); 

if (!IsPostBack) 
{ 
    deptList.DataTextField = "deptname"; 
    deptList.DataValueField = "deptid"; 
    deptList.DataSource = departments; 
    deptList.DataBind(); 
    deptList.Items.Insert(0, new ListItem("---Select Department---", string.Empty)); 
} 
2

爲了詳細說明邁克·穆尼的回答是:你還需要確保你添加的控制反饋到控制樹每回發一次每次回發時都會重新創建控制樹,並從標記中讀入。如果您以編程方式添加一次,並且再也不添加一次,則樹中沒有控制權來接收事件。

+0

謝謝戴夫。是的,我忽略提及這個非常重要的部分,無論是否回發,控件都需要始終創建。之前我也遇到過幾次。 – 2010-02-17 15:27:06

0

看來您並未將控件添加到控件集合中。您必須將控件添加到控件層次結構的某個位置,並確保它在每次回發中都被添加,以確保控件存在以接收事件。通過添加控件,您不需要直接調用RenderControl。

0

我遇到的問題是,如果下拉列表沒有AutoPostBack = true,那麼它永遠不會調用該函數。