DropDownList - 当SelectedValue在代码隐藏中设置为不同的值时,不会触发SelectedIndexChanged

时间:2016-09-20 21:00:26

标签: c# asp.net webforms

我是DropDownList我想监督选择的任何更改,所以我订阅了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事件中。但是,如果我通过设置SelectedValue的{​​{1}}属性来更改代码隐藏中的选择,则不会触发该事件。以下是我的代码,用于说明问题:

DropDownList

我也尝试使用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的{​​{1}}属性并感到震惊,因为即使这样也行不通。

为什么在代码隐藏后更改SelectedIndexDropDownList时不会触发更改事件?

我该如何克服这个问题?

1 个答案:

答案 0 :(得分:1)

SelectedIndexChanged事件仅在所选索引在发布事件之间发生更改时触发。

  

当列表控件中的选择在发布到服务器的帖子之间发生更改时,将引发SelectedIndexChanged事件。 Source

如果您想订阅在更改属性时触发的事件(甚至是以编程方式),那么传统的方法是实现INotifyPropertyChanged。下拉列表控件不会立即实现此功能,但您可以将其子类化并自行实现,然后订阅该事件。

e.g。

class MyDropDownList : DropDownList, INotifyPropertyChanged
{
    event PropertyChangedEventHandler PropertyChanged;

    public override int SelectedIndex
    {
        set 
        {
            base.SelectedIndex = value;
            PropertyChanged(new PropertyChangedEventArgs("SelectedIndex"));
        }
        get
        {
            return base.SelectedIndex;
        }
    }
}

......或类似的东西。以上内容可能无法逐字编译,但您明白了。

似乎浪费时间给我。如果您的页面非常复杂,您需要订阅在同一HTTP事务中触发的事件,您可能会过度使用它。