【问题标题】:DropDownList - SelectedIndexChanged not triggered when SelectedValue has been set to a different value in code-behindDropDownList - 当 SelectedValue 在代码隐藏中设置为不同的值时,未触发 SelectedIndexChanged
【发布时间】:2017-01-28 22:35:06
【问题描述】:

我有一个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 在代码隐藏中被更改时不会触发任何更改事件?

我该如何克服这个问题?

【问题讨论】:

  • 在分配ddl.ddl_SelectedIndexChanged(null, null)后执行此操作;它不是自动的c
  • @techspider 谢谢,是的,我知道我可以手动调用任何事件订阅,但这很脏,在设置SelectedValue 时需要考虑它,总是。有没有更清洁的方法来解决这个问题?
  • 我尝试使用您的代码,但您的下拉列表的数据源不起作用。不想循环或手动将它们添加到 DropDownList.Items 中?
  • @CurseStacker 是的,要绑定它,你必须先调用DataBind。我更改了我的问题以提供一个工作代码示例。

标签: c# asp.net webforms


【解决方案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 事务中触发的事件,您可能做得过火了。

【讨论】:

    猜你喜欢
    • 2011-06-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多