设置选定值不会触发 SelectedIndexChanged

Setting selected value does not trigger SelectedIndexChanged

我有一种情况,当我以编程方式 select 一个项目时,我需要 SelectedIndexChanged 来触发。这就是我正在做的。

我从 FormLoad 上的数据库加载了一个下拉列表,我正在根据查询字符串中传递的信息设置下拉列表的值,如下所示:

if (Request.QueryString["nat"] != null)
{
    ddlTriggers.ClearSelection();
    ddlTriggers.Items.FindByValue(
            Request.QueryString["nat"].ToString()).Selected = true;
}

这确实工作正常,因为它从查询字符串中获取 id 并将其与下拉列表中的特定项目相匹配。问题是仅通过设置 .selected=true 不会触发 selectedIndexChanged 事件。当 selected 索引更改时,我试图设置一些标签。

一些建议显示像这样手动调用 selectedIndexChanged

ddlCommonTasks_SelectedIndexChanged(ddlTriggers, EventArgs.Empty);

但是这会重置 selectedIndex 并向我显示下拉列表中第一项的标签,这当然对我没有任何帮助。

任何建议。

如果我假设您已经为 selectedIndexChanged 事件注册了一个处理程序,那么您可以简单地调用您注册为事件处理程序的同一函数。

如果您已经像这样注册了您的处理程序:

$( ".target" ).change(function() {
  alert( "Handler for .change() called." );
});

您可以在别处定义您的函数,然后传递:

function handler() {
    alert( "Handler for .change() called." );
}

$(".target").change(handler);

现在,在您现有的代码中只需调用您的处理函数:

if (Request.QueryString["nat"] != null)
{
    ddlTriggers.ClearSelection();
    ddlTriggers.Items.FindByValue(Request.QueryString["nat"].ToString()).Selected = true;
    handler();
}

问题是您要在 post 上或在服务器上加载页面时更改选定的索引。该事件不会触发。您可以做的是在 SelectedIndexChanged 处理程序中获取内容并将其重构为单独的方法,可以在您更新值时调用该方法,例如:

ddlCommonTasks_SelectedIndexChanged(object sender, EventArgs e)
{
    var ddl = sender as DropDownList;
    PerformIndexChangedAction(ddl);
}

private void PerformIndexChangedAction(DropDownList ddl)
{
    lblTest.Text=ddl.SelectedItem.Text;
}

修改代码如下:

var nat = Request.QueryString["nat"];
if (!String.IsNullOrWhitespace(nat))
{
    ddlTriggers.ClearSelection();
    ddlTriggers.Items.FindByValue(nat).Selected = true;
    PerformIndexChangedAction(ddlTriggers);
}