当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
事件中跳跃。但是,如果我通过设置DropDownList
的SelectedValue
属性来更改代码隐藏中的选择,则不会触发事件。下面是我的代码来说明这个问题:
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
事件作弊,但问题是一样的。然后我尝试设置DropDownList
的SelectedIndex
属性,并感到震惊,因为即使这样也不行。
为什么当SelectedValue
或SelectedIndex
在代码隐藏中被更改时不会触发更改事件?
我怎样才能克服这个问题?
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事务中触发的事件,那么您可能做得太多了。