我是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}}属性并感到震惊,因为即使这样也行不通。
为什么在代码隐藏后更改SelectedIndex
或DropDownList
时不会触发更改事件?
我该如何克服这个问题?
答案 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事务中触发的事件,您可能会过度使用它。