c#
  • asp.net
  • webforms
  • 2016-09-20 21 views 0 likes 
    0

    我有一個DropDownList我要監督對選擇的任何變化,所以我認購SelectedIndexChanged事件,像這樣:的DropDownList - 時的SelectedValue已被設置爲不同的值的SelectedIndexChanged不會觸發代碼隱藏

    <asp:DropDownList ID="ddl" runat="server" OnSelectedIndexChanged="ddl_SelectedIndexChanged" DataSource='<%# new string[] { "1", "2", "3" } %>' /> 
    <asp:Button ID="b" runat="server" OnClick="b_Click" Text="Test" /> 
    

    如果我改變選擇並點擊按鈕,它會跳到我的SelectedIndexChanged事件中。但是,如果我通過設置DropDownListSelectedValue屬性更改代碼隱藏中的選擇,則不會觸發該事件。這是我後面的代碼來說明這個問題:

    protected void Page_Load(object sender, EventArgs e) 
    { 
        if (!this.Page.IsPostBack) 
        { 
         this.ddl.DataBind(); 
        } 
    } 
    
    protected void b_Click(object sender, EventArgs e) 
    { 
        this.ddl.SelectedValue = "2"; 
    } 
    
    protected void ddl_SelectedIndexChanged(object sender, EventArgs e) 
    { 
        Console.WriteLine("Breakpoint here"); 
    } 
    

    我也試圖通過TextChanged事件作弊,但問題是一樣的。然後我試圖設置DropDownListSelectedIndex屬性,並感到震驚,因爲即使這不起作用。

    爲什麼當SelectedValueSelectedIndex在代碼隱藏方面發生變化時,將不會觸發更改事件?

    我該如何克服這個問題?

    +1

    只需在賦值'ddl.ddl_SelectedIndexChanged(null,null)'後執行此操作;它不是自動c – techspider

    +0

    @techspider謝謝,是的,我知道我可以手動調用任何事件訂閱,但地獄這是骯髒的,它總是需要考慮設置'SelectedValue'時。有沒有更清晰的方法來克服這個問題? – modiX

    +0

    我試圖使用你的代碼,但你的下拉列表的數據源不起作用。不想循環或手動將它們添加到您的DropDownList.Items? – CurseStacker

    回答

    1

    如果所選索引在帖子事件之間發生變化,則只會觸發SelectedIndexChanged事件。

    當從列表控件的選擇在發佈到服務器的帖子之間發生變化時,引發SelectedIndexChanged事件。 Source

    如果你想訂閱的事件將觸發的屬性更改(即使在程序上),傳統的方式做到這一點,是落實INotifyPropertyChanged。下拉列表控件沒有實現這個開箱即用的功能,但您可以對它進行子類化並自己實現,然後訂閱該事件。

    例如

    class MyDropDownList : DropDownList, INotifyPropertyChanged 
    { 
        event PropertyChangedEventHandler PropertyChanged; 
    
        public override int SelectedIndex 
        { 
         set 
         { 
          base.SelectedIndex = value; 
          PropertyChanged(new PropertyChangedEventArgs("SelectedIndex")); 
         } 
         get 
         { 
          return base.SelectedIndex; 
         } 
        } 
    } 
    

    ...或類似的東西。以上內容可能無法逐字彙編,但你明白了。

    看起來像是浪費時間給我。如果你的頁面如此複雜,你需要訂閱在同一個HTTP事務中觸發的事件,你可能會過度使用它。

    相關問題