2011-02-24 101 views
0

ASP.Net web表單,.NET 2.0如何在頁面加載時向ASP.NET控件添加事件?

我有一個兩難的問題。我有了一個自定義的控件的aspx頁面:

<def:CustomControl ID="customID" runat="server" /> 

,如果某些條件得到滿足的自定義控件可以多次添加到ASPX頁面:

<asp:Repeater runat="server" ID="options" OnItemDataBound="options_OnItemDataBound"> 
    <HeaderTemplate> 
     <table border="0" cellpadding="0" cellspacing="0" width="100%"> 
      <tr> 
    </HeaderTemplate> 
    <ItemTemplate> 
       <td> 
        <span> 
         <asp:Label runat="server" ID="optionName"> 
         </asp:Label> 
         <asp:DropDownList runat="server" ID="optionValues" CssClass="PartOption" > 
         </asp:DropDownList> 
        </span> 
       </td> 
    </ItemTemplate> 
    <FooterTemplate> 
      </tr> 
     </table> 
    </FooterTemplate> 
</asp:Repeater> 

在代碼中的aspx的背後頁面,我想追加一個事件(OnSelectedItemChange)到下拉控件,它實際上並不在ASPX頁面上(尚)。然而,當我嘗試做一些像以下代碼背後:

foreach(Control eachControl in customID.Controls) { 
    if (eachControl.HasControls) { 
     Control DdControl = eachControl.FindControl("optionValues"); //always null 

     if (DdControl != null && DdControl is typeOf(DropDownList)) { 
      DdControl = DdControl as DropDownlist; //I might have the syntax wrong 
                //here, but you get the point. 

      //add event to control. 
     } 
    } 
} 

但所有這一切eachControl已經是一箇中繼器,它顯示了其childcontrol計數爲0。因此,當它到達FindControl方法,它總是返回null。

問題 所以我試圖做的是一個事件(OnSelectedItemChange)添加到中繼器內部的下拉列表控制(也就是當條件滿足的是被添加到頁面中的自定義控制)。在下拉菜單中進行選擇時,我希望它觸發Event方法。

如何,我不是:

A)找到一個方法,如果頁面上存在的下拉列表控件添加事件?

OR

B)的一種方法,以便能夠身後調用代碼的方法,並從所有的下降通過選擇下拉列表(因爲自定義控件可以增加一次創建多個下拉菜單嗎?

注意我沒有在我面前的代碼,所以如果我有一些語法錯誤,請忽略我也知道ID是唯一的,所以這也被認爲是我的邏輯問題。當它呈現這些時,ID的可能會被asp名稱慣例所破壞,我認爲我必須找到解決辦法。

+0

首先用哪種方法試着執行上面的代碼? 其次爲什麼不在自定義控件上創建事件。這可能不是唯一的一次有人想要subsribe到selectchanged事件 – 2011-02-24 12:34:42

+0

你是指DropDownList的'SelectedIndexChanged'事件嗎? – 2011-02-24 12:35:08

+0

@LordCover - 是的。 @Rune FS - 我不確定我是否遵守。我更新了上述自定義控件。但是由於自定義控件的代碼位於單獨的頁面上,因此如何將它放在ASPX頁面上的控件上,影響嵌入在自定義控件Repeater中的下拉列表控件? – pghtech 2011-02-24 14:39:05

回答

2

如果您在自定義控件上創建該事件,則不需要檢查它是否存在於頁面上。如果確實如此,它肯定會觸發事件。或者我在這裏錯過了什麼?



編輯:

什麼你需要做的就是在你的控制聲明一個公共事件,那麼當SelectedIndexChanged事件被炒了,你會觸發該事件,並接受它這一頁。

所以在你的控制,你就必須:

public delegate void MyIndexChangedDelegate(string value); 
public event MyIndexChangedDelegate MyEvent; 

protected void myDropDown_SelectedIndexChanged(object sender, EventArgs e) 
{ 
    MyEvent(myDropDown.SelectedValue); // Or whatever you want to work with. 
} 

然後在網頁上,你的控件聲明你必須:

<usc:control1 runat="server" OnMyEvent="EventReceiver" /> 

而且在後面的代碼:

protected void EventReceiver(string value) 
{ 
    // Do what you have to do with the selected value, which is our local variable 'value' 
    ClientScript.RegisterStartupScript(typeof(Page), "Alert", string.Format("<script language='JavaScript'>alert('User selected value {0} on my DropDown!');</script>"), value); 
} 

這應該工作。

+0

ASPX頁面< def:CustomControl>是自定義控件邏輯類的一個單獨的頁面/類,所以我不能將事件(OnSelectedIndexChanged)放在下拉列表控件上,該控件指向ASPX頁面的代碼隱藏方法(它贏得了' t知道它,不會建立)這就是問題的本質 – pghtech 2011-02-24 14:43:31

+0

@pghtech我明白了所以我編輯了我的答案並添加了一些代碼,希望它對你有用 – Smur 2011-02-24 15:21:31

+0

這是行不通的。我沒有看到我是如何綁定到下拉列表以便能夠應用任何邏輯 – pghtech 2011-02-25 14:55:16

2

假設你不能把這個邏輯放在控制本身中,你需要做什麼我認爲是訪問中繼器並附加一個ItemDataBound事件。事情是這樣的:

Repeater options = customID.FindControl("options") as Repeater; 
if (options != null) 
{ 
    options.ItemDataBound += new RepeaterItemEventHandler(OptionsItemDataBound); 
} 

然後在ItemDataBound事件,你會做這樣的事情:

void OptionsItemDataBound(object sender, RepeaterItemEventArgs e) 
{ 
    DropDownList optionValues = e.Item.FindControl("optionValues") as DropDownList; 
    if (optionValues != null) 
    { 
     //perform logic you need here 
    } 
} 

我沒有時間去嘗試了這一點正確的這一分鐘,但我懷疑應該工作。

+0

但是什麼使得我綁定中繼器來觸發事件(OptionsItemDataBound)? – pghtech 2011-02-25 14:51:36

+0

此外,我發現我可以找到中繼器,但它沒有任何控制 - ?? – pghtech 2011-02-25 14:53:12

+0

我假設的中繼器已經有一個與之相關的數據源。這只是添加一個額外的鉤子,所以你可以執行額外的工作,如果需要的話。至於中繼器的控制,你不會找到任何。您需要從ItemDataBound事件訪問DropDownList以執行與這些控件相關的附加步驟。 – 2011-02-25 15:49:27

相關問題