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

本文关键字:SelectedIndexChanged 隐藏 代码 设置 SelectedValue | 更新日期: 2023-09-27 18:07:53

我有一个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事件中跳跃。但是,如果我通过设置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在代码隐藏中被更改时不会触发更改事件?

我怎样才能克服这个问题?

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

SelectedIndexChanged事件仅在所选索引在post事件之间发生变化时触发。

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

如果你想订阅每当属性被改变时触发的事件(即使是编程的),传统的方法是实现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事务中触发的事件,那么您可能做得太多了。

相关文章:
  • 没有找到相关文章