65.9K
CodeProject 正在变化。 阅读更多。
Home

为什么 DropDownList 的 SelectedValue 在 SelectedIndexChanged 事件中不起作用?

2014 年 5 月 22 日

CPOL

2分钟阅读

viewsIcon

82937

为什么 DropDownList 的 SelectedValue 在 SelectedIndexChanged 事件中不起作用?

Debugger Inside DropDown SelectedIndexChanged Event

在 DropDown SelectedIndexChanged 事件中使用调试器
在这个博客中,我们将探讨 ASP.NET 开发者有时会遇到的一个有趣的错误。

错误

DropDownListSelectedValueSelectedIndexChanged 事件中没有给出当前选择的值,而是给出了默认值或第一个选项的值。

步骤

  1. 让我们首先声明一个 DropDownList
    <asp:DropDownList ID="ddlDropDownId" runat="server" AutoPostBack="true" 
                      OnSelectedIndexChanged="ddlDropDownId_SelectedIndexChanged">
    </asp:DropDownList>
  2. 现在为了绑定 DropDownList,我们将编写一个如下的函数...
    private void BindDropDownList()
    {
        // Declare a Dictionary to hold all the Options with Value and Text.
        Dictionary<string, string> options = new Dictionary<string, string>();
        options.Add("-1", "Select Option");
        options.Add("1", "Option 1");
        options.Add("2", "Option 2");
        options.Add("3", "Option 3");
        options.Add("4", "Option 4");
        options.Add("5", "Option 5");
    
        // Bind the Dictionary to the DropDownList.
        ddlDropDownId.DataSource = options;
        ddlDropDownId.DataTextField = "value";
        ddlDropDownId.DataValueField = "key";
        ddlDropDownId.DataBind();
    }
  3. 所以,当您运行页面时,它会在页面上显示带有已定义选项的 DropDownList

    DropDownList on Browser

    浏览器上的 DropDownList
  4. 当您从 DropDownList 中选择一个选项时,它会触发代码后面的 SelectedIndexChanged 事件。如果您需要获取 SelectedValue,那么您将编写...
    protected void ddlDropDownId_SelectedIndexChanged(object sender, EventArgs e)
    {
        string value = ddlDropDownId.SelectedValue;
    }

现在问题来了

当我们在事件内部放置一个调试器并检查时,无论选择哪个选项,它总是给出第一个选项的值,即 “-1”。 请参考顶部的调试屏幕截图。
毫无疑问,第一个选项的值是 “-1”,因为我们可以从 DropDownList 的 *Source HTML* 中清楚地看到。 请参阅下图中的突出显示的选项。

DropDownList Source HTML

DropDownList 源代码 HTML

有什么提示吗?

因为我们总是得到默认值或第一个值,所以猜测是,当我们选择一个选项时,有什么东西导致 DropDownList 再次绑定。

让我们找出答案!!!

在步骤中,我提到了 BindDropDownList() 函数,它绑定 DropDownList。 但是我们需要检查它到底在哪里被调用。 因为当页面加载时显示 DropDownList,所以它必须存在于 *Page Load* 事件中。

protected void Page_Load(object sender, EventArgs e)
{
    BindDropDownList();
}

现在,根据 *事件生命周期* 规则,当您从 DropDownList 中选择一个选项时,它会回发并首先转到 *Page Load* 事件,然后才会到达 SelectedIndexChanged 事件。
这意味着,在选择任何选项时,它会再次进入页面加载,并调用 BindDropDownList()。 因此,在它进入 SelectedIndexChanged 事件之前,DropDownList 再次被绑定。 由于 DropDownList 再次被绑定,所以 SelectedValue 现在是第一个选项的值,即“-1”(对于“选择选项”)。

修复?

您可能已经得到了答案。 那就是 IsPostBack Property

获取一个值,该值指示页面是第一次呈现还是正在加载以响应回发。

它告诉您是第一次加载页面,还是由于任何事件引起的 *回发*。 修改后的代码如下所示

protected void Page_Load(object sender, EventArgs e)
{
    if (!IsPostBack)
    {
        BindDropDownList();
    }
}

所以,请小心并分享这个,以拯救某人的一天!!!

您可能已经在您的页面中使用了所有的代码来找出问题,但最终您会发现这是因为您忘记检查 IsPostBack 属性。 所以,喜欢并与您的朋友分享,以便任何无法找到问题的人最终都可以松一口气。

© . All rights reserved.